永続性モデル
エンティティは、軽量の永続性ドメイン・オブジェクトです。エンティティの永続性状態は、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
注釈を指定すると、次の構成を指定できるようになります。
表15-1 NosqlTable注釈の属性
パラメータ | 型 | Oracle NoSQL Databaseでは無視/オプション/必須 | Oracle NoSQL Database Cloud Serviceでは無視/オプション/必須 | デフォルト | 説明 |
---|---|---|---|---|---|
tableName |
String |
オプション | オプション | 空 |
表の名前(単純または名前空間で修飾された形式)を指定します。 空の場合は、エンティティ・クラス名が使用されます。 ネームスペースの詳細は、『SQLリファレンス・ガイド』のネームスペースの管理に関する項を参照してください。 Oracle NoSQL Database Cloud Serviceでは、ネームスペース部分(指定されている場合)がコンパートメント名として使用されます。コンパートメントの使用の詳細は、Oracle NoSQL Database Cloud Serviceの使用のコンパートメントの概要に関する項を参照してください。 |
autoCreate |
boolean |
オプション | オプション | true |
表が存在しない場合に作成するかどうかを指定します。 ノート: Spring Data Frameworkは、init フェーズでアプリケーションで使用されるリポジトリを検索します。表が存在しないときに、@NosqlTable 注釈のautoCreate がtrue の場合は、init フェーズで表が作成されます。
|
readUnits |
int |
無視 | 必須 | -1 |
表を作成する場合に使用する最大読取りスループットを指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、readUnits パラメータを0 より大きい値に設定する必要があります。それ以外の場合は、エラーが返されます。
|
writeUnits |
int |
無視 | 必須 | -1 |
表を作成する場合に使用する最大書込みスループットを指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、writeUnits パラメータを0 より大きい値に設定する必要があります。それ以外の場合は、エラーが返されます。
|
storageGB |
int |
無視 | 必須 | -1 |
表を作成する場合に表に許容される記憶域の最大量をGB単位で指定します。
ノート: Oracle NoSQL Database Cloud Serviceでは、storageGB パラメータを0 より大きい値に設定する必要があります。それ以外の場合は、エラーが返されます。
|
timeout |
int |
オプション | オプション | 0 |
タイムアウト例外がスローされるまでに操作に許容される時間の最長時間(ミリ秒)を指定します。
|
consistency |
String |
オプション | オプション | EVENTUAL |
読取り操作に使用する整合性を指定します。 有効な値は、 ノート: これは、すべての読取り操作に対するデフォルトです。これは、NosqlRepository.setConsistency(String) を使用するとオーバーライドできます。詳細は、SDK for Spring Data APIリファレンスのsetConsistencyに関する項を参照してください。
|
主キー
表には主キーが必要です。エンティティのID
という名前のフィールドが主キーとして使用されます。@NosqlId
注釈または@id
注釈を使用すると、主キーとして指定するエンティティ内の別のフィールド(ID
以外の名前のフィールド)を選択できます。
ID
フィールドが主キー列にマップされると、Spring Data Frameworkは、そのフィールドに対応するデータ型を表に格納する前に自動的に割り当てます。次に、ID
フィールドについて、JavaとOracle NoSQL Databaseのデータ型間のマッピングのリストを示します。
次の表に示すJavaの型のみが、主キーに使用できる有効なデータ型です。
表15-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によって作成される表の2番目の列にkv_json_
という名前が付けられ、その列が永続エンティティの主キーの属性としてリストされないすべての属性を格納するJSON列になるためです。
@NosqlId
フィールド注釈は、次の追加構成を受け入れます。
表15-3 NosqlId注釈の属性
パラメータ | 型 | オプション/必須 | デフォルト | 説明 |
---|---|---|---|---|
generated |
boolean |
オプション | false |
|
ノート:
コンポジット主キーはサポートされていません。JSON列
エンティティの主キー・フィールド以外のすべてのフィールドは、次のルールに従ってNoSQL JSON値に変換されます。
- Javaのスカラー値は、NoSQL JSONアトミック値に変換されます。
- Javaのコレクションと配列構造は、NoSQL JSON配列に変換されます。
- Javaの非スカラー値は、NoSQL JSONオブジェクトに再帰的に変換されます。
- Javaのnull値は、NoSQL JSON NULL値に変換されます。
- 複合値は、次の表に従ってNoSQL JSONオブジェクトに変換されます。
表15-4 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データの概要に関する項を参照してください。 ノート: ポリゴンは、適切な形式になるように次のルールに準拠する必要があります。適切な形式になっていないと、問合せでの使用時に無視されます。
|
|
ノート:
|
POJO<f1 T1, f2 T2...> |
|
ノート:
サイクルが含まれているJavaデータ構造は、サポートも検出もされません。つまり、エンティティ・オブジェクトをルートからフィールドに向けて調べていったときに同じオブジェクトが2回出現した場合、そのオブジェクトはサイクルになります。