永続性モデル
永続表およびSpring Data Framework注釈のスキーマについて学習します。
エンティティは、軽量の永続性ドメイン・オブジェクトです。エンティティの永続性状態は、Java Beans/Plain Old Java Object (POJO)を使用する永続フィールドによって表されます。
Spring Data Frameworkは、Oracle NoSQL Database表に向けたエンティティの永続性をサポートします。エンティティは表にマップされます。そのエンティティのID
フィールドが、その表の主キー列にマップされます。その他のエンティティ内のすべてのフィールドは、その表のJSON列にマップされます。エンティティの各インスタンスは、その表の単一行として格納されます。そのインスタンスのID
フィールドの値は、その行の主キー値として格納されます。そのインスタンスのその他すべてのフィールド(その他のオブジェクトを含む) (「JSON列」を参照)の値は、シリアライズされて、その行のJSON列に値として格納されます。実質的に、表には常に主キー列とJSON列の2つの列のみが含まれます。
永続性POJOに、別の表にマップされる別の永続性POJO (ネストされたオブジェクト)への参照がある場合、Spring Data Frameworkではオブジェクトを複数の表にシリアライズしません。かわりに、すべてのネストされたオブジェクトがシリアライズされて、値としてJSON列に格納されます。JSON列のマッピングの詳細は、「JSON列」を参照してください。
次に、@NosqlTable
および@NosqlId
の注釈が付いたエンティティの構文を示します。次の例では、@NosqlTable
注釈が付いたStudent
クラスが、Oracle NoSQL DatabaseのStudent
という名前の表にマップされます。@NosqlId
注釈が付いたID
フィールドは、Student
表の主キー・フィールドになります。firstName
フィールドとlastName
フィールドは、Student
表のkv_json_
という名前の単一のJSONフィールドにマップされます。
ノート:
このクラスには他のコンストラクタもある場合があります。/*The @NosqlTable annotation specifies that
this class will be mapped to an Oracle NoSQL Database table.*/
@NosqlTable
public class Student {
//The @NosqlId annotation specifies that this field will act as the ID field.
@NosqlId
public long ID;
public String firstName;
public String lastName;
public Student() {}
}
表名
デフォルトでは、エンティティ・クラス名が表名として使用されます。@NosqlTable
注釈を使用することで、別の表名を指定できます。@NosqlTable
注釈を使用すると、表名やタイムアウトなどの追加の構成パラメータを定義できます。
たとえば、Student
という名前のエンティティは、Student
という名前の表に永続化されます。Student
という名前のエンティティをLearner
という名前の表に永続化する場合は、@NosqlTable
注釈を使用します。
@NosqlTable
注釈を指定すると、次の構成を指定できるようになります。
表1-1 NosqlTable注釈の属性
パラメータ | 型 | Oracle NoSQL Databaseでは無視/オプション/必須 | Oracle NoSQL Database Cloud Serviceでは無視/オプション/必須 | デフォルト | 説明 |
---|---|---|---|---|---|
tableName |
String |
オプション | オプション | 空 |
表の名前(単純または名前空間で修飾された形式)を指定します。 空の場合は、エンティティ・クラス名が使用されます。 ネームスペースの詳細は、『SQLリファレンス・ガイド』のネームスペースの管理を参照してください。 Oracle NoSQL Database Cloud Serviceでは、ネームスペース部分(指定されている場合)がコンパートメント名として使用されます。コンパートメントの使用の詳細は、Oracle NoSQL Database Cloud Serviceガイドのコンパートメントの作成を参照してください。 |
autoCreateTable |
boolean |
オプション | オプション | true |
表が存在しない場合に作成する必要があるかどうかを指定します。 ノート: Spring Data Frameworkは、init フェーズでアプリケーションで使用されるリポジトリを検索します。表が存在しないときに、@NosqlTable 注釈のautoCreateTable がtrue の場合は、init フェーズで表が作成されます。
|
readUnits |
int |
無視 | 必須 | -1 |
表を作成する場合に使用する最大読取りスループットを指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、readUnits パラメータを0 より大きい値に設定する必要があります。値を設定しない場合、Oracle NoSQL Database Cloud Serviceによってエラーが返されます。
|
writeUnits |
int |
無視 | 必須 | -1 |
表を作成する場合に使用する最大書込みスループットを指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、writeUnits パラメータを0 より大きい値に設定する必要があります。値を設定しない場合、Oracle NoSQL Database Cloud Serviceによってエラーが返されます。
|
storageGB |
int |
無視 | 必須 | -1 |
表を作成する場合に、表に許可される記憶域の最大量をGB単位で指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、storageGB パラメータを0 より大きい値に設定する必要があります。値を設定しない場合、Oracle NoSQL Database Cloud Serviceによってエラーが返されます。
|
timeout |
int |
オプション | オプション | 0 |
タイムアウト例外がスローされるまでに操作に許可される時間の最長時間(ミリ秒)を指定します。
|
consistency |
String |
オプション | オプション | EVENTUAL |
読取り操作に使用する整合性を指定します。 有効な値は、 ノート: これは、すべての読取り操作に対するデフォルトです。これは、NosqlRepository.setConsistency(String) を使用するとオーバーライドできます。詳細は、SDK for Spring Data APIリファレンスのsetConsistencyに関する項を参照してください。
|
durability | String | オプション | オプション | COMMIT_NO_SYNC |
この表に適用されるすべての書込み操作のデフォルトの永続性を設定します。
|
capacityMode | NosqlCapacityMode
詳細は、NosqlCapacityModeを参照してください。 |
オプション | オプション | NosqlCapacityMode.PROVISIONED |
表の作成時に容量モードを設定します。これは、クラウドまたはクラウドのシミュレーション・シナリオでのみ適用されます。 表は、 TableLimitsインスタンスの値を、容量モードに基づいて次のように設定します。
|
ttl | int | オプション | オプション | 0 |
表の作成時にデフォルトの表レベルTime to Live (TTL)を設定します。TTLを使用すると、指定した期間の経過後に表の行を自動的に期限切れにできます。 値が設定されていない場合、値 このパラメータは、autoCreateTableがtrueに設定されている場合にのみ適用可能です。 |
ttlUnit | TtlUnit | オプション | オプション | NosqlTable.TtlUnit.DAYS |
TTL値の単位を設定します。有効な値は、 値が設定されていない場合、デフォルト値の日が使用されます。 このパラメータは、autoCreateTableがtrueに設定されている場合にのみ適用可能です。 |
主キー
表には主キーが必要です。エンティティのID
という名前のフィールドが主キーとして使用されます。@NosqlId
注釈または@id
注釈を使用すると、主キーとして指定するエンティティ内の別のフィールド(ID
以外の名前のフィールド)を選択できます。
ID
フィールドが主キー列にマップされると、Spring Data Frameworkは、そのフィールドに対応するデータ型を表に格納する前に自動的に割り当てます。次に、ID
フィールドについて、JavaとOracle NoSQL Databaseのデータ型間のマッピングのリストを示します。
次の表に示すJavaの型のみが、主キーに使用できる有効なデータ型です。
表1-2 JavaとOracle NoSQL Databaseの型のマッピング
Javaの型 | Oracle NoSQL Databaseの型 |
---|---|
|
|
|
|
|
|
|
ノート: double 、java.lang.Double 、float およびjava.lang.Float は主キーにできますが、有効なgenerated=true の型ではありません
ノート: Oracle NoSQL DatabaseのFLOAT 型はNoSQL SDK for Javaでは明示的に使用されていないため、Javaのfloat とjava.lang.Float はDOUBLE 型にマップされます。
|
|
|
|
|
|
|
@NosqlId
注釈: 主キーとして有効なデータ型のフィールドに@NosqlId
注釈が使用されている場合は、そのフィールドが主キーとみなされます。主キーとして有効なデータ型以外の型のフィールドに@NosqlId
を使用すると、エラーが発生します。詳細は、SDK for Spring Data APIリファレンスのNosqlIdに関する項を参照してください。@org.springframework.data.annotation.Id
注釈: 主キーとして有効なデータ型のフィールドに@org.springframework.data.annotation.Id
フィールド注釈が使用されている場合は、そのフィールドが主キーとみなされます。主キーとして有効なデータ型以外の型のフィールドに@org.springframework.data.annotation.Id
を使用すると、エラーが発生します。- 未指定: 前述の2つの注釈のどちらも指定されていない場合、Spring Data Frameworkは、主キーとして
ID
という名前のフィールドを使用します。
- エンティティに
@NosqlId
注釈、@org.springframework.data.annotation.Id
注釈またはID
フィールドが見つからない場合。主キー・フィールドを推測できません。 - エンティティに
@NosqlId
または@org.springframework.data.annotation.Id
の注釈付きフィールドが複数使用されている場合。複数の主キー・フィールドが推測されます。
ノート:
@NosqlId
注釈または@org.springframework.data.annotation.Id
注釈を付けるフィールドの名前は、kv_json_
という名前にしないでください。これは、Spring Data Frameworkによって作成される表のデータ列にkv_json_
という名前が付けられ、永続エンティティの主キーの属性としてリストされていないすべての属性を格納するJSON列になるためです。
@NosqlId
フィールド注釈は、次の追加構成を受け入れます。
表1-3 NosqlId注釈の属性
パラメータ | 型 | オプション/必須 | デフォルト | 説明 |
---|---|---|---|---|
generated |
boolean |
オプション | false |
ノート: コンポジット・キーは自動生成できません。@NosqlId.autoGenerated=true を設定すると、エラーが発生します。コンポジット・キーを使用する場合は、すべての読取り/書込みコールのキー値を管理する必要があります。キー値が設定されていない場合、Oracle NoSQL Databaseはエラーを生成します。
|
コンポジット主キー
コンポジット主キーには、複数の主キー・フィールドが含まれます。コンポジット・キーを表すためにコンポジット・キー・クラス・タイプを定義できます。
コンポジット・キー・クラスは、エンティティ・クラスの複数の主キー・フィールドにマップされるタイプです。コンポジット・キー・クラスはシリアライズ可能である必要があり、equalsおよびhashcodeメソッドを定義する必要があります。このクラスは、プリミティブ・データ型のフィールドで構成されている必要があります。
ノート:
コンポジット・キー・クラスのユーザー定義メソッドの等価性チェックは、Oracle NoSQL Databaseでデータベース・タイプとマップされたキーとの間で実行される等価性チェックと一致している必要があります。@NosqlKe
y注釈を使用すると、コンポジット・キー・クラスのコンポジット主キーのコンポーネントを指定できます。
表1-4 Nosqlkey注釈の属性
パラメータ | 型 | オプション/必須 | デフォルト | 説明 |
---|---|---|---|---|
shardKey |
boolean |
オプション |
true |
主キー・フィールドがシャード・キーでもあるかどうかを識別します。シャード・キーは、シャード間の行の分散に影響します。
|
order |
int |
オプション |
システム決定 |
コンポジット・キー・クラスの主キー内のシャード・キーおよび非シャード・キーの順序を指定します。 次のルールに基づいて
|
@NosqlKey
注釈の詳細は、SDK for Spring Data APIリファレンス・ドキュメントのNosqlKeyを参照してください。
例: コンポジット・キーの順序付け
主キー・フィールドuniversityId、academicYearおよびstudentIdがコンポジット・キー・クラスに定義されているとします。
universityId
およびacademicYear
フィールドは、シャード・キーの一部として定義できます。これらのシャード・キーの順序値は、非シャード・キーであるstudentId
フィールドより小さくする必要があります。次のサンプル・コードを使用してコンポジット・クラスを作成できます。/* Define a composite Key class */
public class StudentKey implements Serializable {
@NosqlKey(shardKey = true, order = 1)
long universityId;
@NosqlKey(shardKey = true, order = 0)
int academicYear;
@NosqlKey(shardKey = false, order = 2)
long studentId;
/* public or package protected constructor required when retrieving from database */
public StudentKey() {
}
}
前述の例では、academicYear
フィールドは、表の作成時に最初の主キー・フィールドとみなされます。
/* Table DDL */
CREATE TABLE IF NOT EXISTS Students (
academicYear INTEGER,
universityId LONG,
studentId LONG,
kv_json_ JSON,
PRIMARY KEY(SHARD(academicYear, universityId), studentId)
)
order
フィールドを指定しないコンポジット・キー・クラスを考えてみます。 /* Define a composite Key class */
public class StudentKey implements Serializable {
@NosqlKey(shardKey = true)
long universityId;
@NosqlKey(shardKey = true)
int academicYear;
@NosqlKey(shardKey = false)
long studentId;
@NosqlKey(shardKey = false)
long branchId;
/* public or package protected constructor required when retrieving from database */
public StudentKey() {
}
}
/* Table DDL */
CREATE TABLE IF NOT EXISTS Students (
academicYear INTEGER,
universityId LONG,
branchId LONG,
studentId LONG,
kv_json_ JSON,
PRIMARY KEY(SHARD(academicYear, universityId), branchId, studentId)
)
次の場合、Spring Data Frameworkでは、すべての主キー・フィールドがシャード・キーとみなされ、アルファベット順が使用されます。
@NosqlKey
注釈を使用せずにコンポジット・キー・クラスの主キー・フィールドを宣言した場合。@NosqlKey
注釈でshardKey
およびorder
値を指定せずに、コンポジット・キー・クラスの主キー・フィールドを宣言した場合。
コンポジット・キー・クラスの次のプロパティに注意してください。
- コンポジット・キー・クラスに
shardKey=true
を含むフィールドが少なくとも1つ必要です。そうしないと、Spring Data Frameworkはエラーを生成します。 - リポジトリとともにコンポジット・キー・クラスを(
ID
タイプとして)使用し、エンティティのアイデンティティを単一のオブジェクトで表すことができます。 - フィールドを
@transient
として注釈付けすると、フィールドの非永続状態を指定できます。 - コンポジット・キー・クラスはネストできません。これによりエラーが生成されます。
- コンポジット主キー・フィールドは自動生成できません。
@NosqlId.autoGenerated=true
を設定すると、エラーが発生します。コンポジット・キーを使用する場合は、すべての読取り/書込みコールのキー値を管理する必要があります。キー値が設定されていない場合、Oracle NoSQL Databaseはエラーを生成します。
JSON列
エンティティの主キー・フィールド以外のすべてのフィールドは、次のルールに従ってNoSQL JSON値に変換されます。
- Javaのスカラー値は、NoSQL JSONアトミック値に変換されます。
- Javaのコレクションと配列構造は、NoSQL JSON配列に変換されます。
- Javaの非スカラー値は、NoSQL JSONオブジェクトに再帰的に変換されます。
- Javaのnull値は、NoSQL JSON NULL値に変換されます。
- 複合値は、次の表に従ってNoSQL JSONオブジェクトに変換されます。
表1-5 Javaの型とNoSQL JSONの型のマッピング
Javaの型 | Oracle NoSQL Database JSONデータ型での表現 |
---|---|
|
|
|
|
|
|
|
ノート: Oracle NoSQL DatabaseのFLOAT 型はNoSQL SDK for Javaでは明示的に使用されていません。そのため、Javaのfloat とjava.lang.Float はDOUBLE 型にマップされます。
|
|
|
|
|
|
|
|
|
|
GeoJsonポイント GeoJsonデータの詳細は、『SQLリファレンス・ガイド』のGeoJsonデータについてを参照してください。 |
|
GeoJsonポリゴン GeoJsonデータの詳細は、『SQLリファレンス・ガイド』のGeoJsonデータについてを参照してください。 ノート: ポリゴンは、適切な形式になるように次のルールに準拠する必要があります。適切な形式になっていないと、問合せでの使用時に無視されます。
表に新しいポリゴンを挿入する前に、 |
|
ノート:
|
|
|
|
|
|
MAP(JSON) ノート:
|
ノート:
サイクルが含まれているJavaデータ構造は、サポートも検出もされません。つまり、エンティティ・オブジェクトをルートからフィールドに向けて調べていったときに同じオブジェクトが2回出現した場合、そのオブジェクトはサイクルになります。