ObjectQuery スキーマの構成

ObjectQuery は、スキーマまたは形状情報によってセマンティック検査を実行し、パス式を評価します。このセクションでは、スキーマを XML で、またはプログラマチックに定義する方法について説明します。

スキーマの定義

ObjectMap スキーマの定義は、ObjectGrid デプロイメント記述子 XML で、または標準の eXtreme Scale 構成手法を用いてプログラマチックに行います。スキーマの作成方法の例については、ObjectQuery スキーマの構成を参照してください。

スキーマ情報は Plain Old Java Object (POJO) を 記述します。つまり、POJO を構成している属性、存在する属性のタイプ、 属性が 1 次キー・フィールドなのか、単一値のリレーションシップまたは多値のリレーションシップなのか、それとも双方向リレーションシップ なのかを記述します。ObjectQuery は、スキーマ情報に基づいてフィールド・アクセスまたはプロパティー・アクセスを使用します。

照会可能属性

スキーマが ObjectGrid で定義されていると、そのスキーマ内のオブジェクトはリフレクションを使用してイントロスペクトされ、照会に使用できる属性が決定されます。以下の属性タイプを照会できます。
  • ラッパーを含む Java プリミティブ型
  • java.lang.String
  • java.math.BigInteger
  • java.math.BigDecimal
  • java.util.Date
  • java.sql.Date
  • java.sql.Time
  • java.sql.Timestamp
  • java.util.Calendar
  • byte[]
  • java.lang.Byte[]
  • char[]
  • java.lang.Character[]
  • J2SE 列挙型

上記以外の組み込みのシリアライズ可能な型も、照会結果に組み込むことができますが、照会の WHERE 文節または FROM 文節に組み込むことはできません。シリアライズ可能属性はナビゲート可能ではありません。

型がシリアライズ可能ではない場合、フィールドまたはプロパティーが静的な場合、またはフィールドが一時的なものである場合は、属性型をスキーマから除外できます。すべてのマップ・オブジェクトはシリアライズ可能でなければならない ため、ObjectGrid は、オブジェクトからの永続可能な属性のみを 含みます。それ以外のオブジェクトは無視されます。

フィールド属性

フィールドを使用してオブジェクトにアクセスするようスキーマが構成されている場合、すべてのシリアライズ可能な非一時的フィールドは自動的にスキーマに組み込まれます。照会内のフィールド属性を選択するには、クラス定義に記述されているとおりのフィールド ID 名を使用します。

スキーマには、すべての public、private、protected、および package protected フィールドが組み込まれます。

プロパティー属性

プロパティーを使用してオブジェクトにアクセスするようスキーマが構成されている 場合、JavaBeans プロパティー命名規則に従うすべてのシリアライズ可能メソッドが自動的にスキーマに組み込まれます。照会用にプロパティー属性を選択 するには、JavaBeans スタイルのプロパティー命名規則 を使用します。

スキーマには、すべての public、private、protected および package protected プロパティーが組み込まれます。

以下のクラスでは、名前、誕生日、および有効性を示す属性がスキーマに追加されます。

public class Person {
  public String getName(){}
  private java.util.Date getBirthday(){}
  boolean isValid(){}
  public NonSerializableObject getData(){}
}

COPY_ON_WRITE の CopyMode を使用する場合、照会スキーマは、常にプロパティー・ベースのアクセスを使用しなければなりません。COPY_ON_WRITE では、マップからオブジェクトが取得される場合は常にプロキシー・オブジェクトを作成し、それらのオブジェクトにアクセスできるのはプロパティー・メソッドを使用する場合に限られます。そうしない場合、各照会結果がヌルに設定されます。

関係

各リレーションシップは、スキーマ構成に明示的に定義する必要があります。リレーションシップの基数は、属性の型によって自動的に決定されます。属性が java.util.Collection インターフェースを実装している場合、リレーションシップは 1 対多または多対多のいずれかのリレーションシップです。

エンティティー照会とは異なり、キャッシュされている他のオブジェクトを参照している属性は、そのオブジェクトへの直接参照を保管することはできません。他のオブジェクトへの参照は、そのオブジェクトを包含するオブジェクトのデータの一部としてシリアライズされます。代わりに、関連するオブジェクトへのキーを保管してください。

例えば、Customer と Order の間に、以下のような多対 1 のリレーションシップがあるとします。

誤。オブジェクト参照を保管しています。

public class Customer {
  String customerId;
  Collection<Order> orders;
}

public class Order {
  String orderId;
  Customer customer;
}
正。関連オブジェクトへのキー。

public class Customer {
  String customerId;
  Collection<String> orders;
}

public class Order {
  String orderId;
  String customer;
}

2 つのマップ・オブジェクトを 1 つに結合する照会を実行すると、キーは自動的に大きくなります。例えば、以下の照会は Customer オブジェクトを返します。

SELECT c FROM Order o JOIN Customer c WHERE orderId=5

索引の使用

ObjectGrid は、索引プラグインを使用して、マップに索引を追加します。照会エンジンは、com.ibm.websphere.objectgrid.plugins.index.HashIndex 型のスキーマ・マップ・エレメントで定義されている索引を自動的に組み込み、rangeIndex プロパティーは true に設定されます。索引の型が HashIndex ではなく、rangeIndex プロパティーが true に設定されていない場合、照会はその索引を無視します。スキーマに索引を追加する方法を示す例については、ObjectQuery チュートリアル - ステップ 2 を参照してください。