この章では、非リレーショナル・データ・ソースと連携するようにJPAアプリケーションを設定する方法について説明します。非リレーショナル・データ・ソースには多くのタイプがあります。これには、ドキュメント・データベース、キー/値ストア、および他の様々な非標準データベース(MongoDB、Cassandra、Google BigTableなど)が含まれます。この章では、主にNoSQLデータ・ストアについて説明します。NoSQLは、SQL標準をサポートしないデータベース・システムの類型です。EclipseLinkでは、Java Persistence API (JPA)を通じたNoSQLデータベースに対するJavaオブジェクトの永続化がサポートされます。EclipseLinkのネイティブAPIも、NoSQLデータベースでサポートされます。
この章の内容は次のとおりです。
NoSQLは、SQL標準をサポートしないデータベース・システムの類型です。NoSQLの類型は、アプリケーション・データベース、レガシー・データベース、メッセージ・システム、トランザクション処理モニターなど(たとえば、IMS、VSAMおよびADABASE)のEnterprise Information Systems (EIS)を含めるように拡張できます。
EclipseLinkのNoSQLサポートには、次のものが含まれます。
MongoDB
Oracle NoSQL
XMLファイル
JMS
Oracle AQ
EclipseLinkによるNoSQLサポートの詳細は、A.3項「非SQL標準データベースのサポート: NoSQL」を参照してください。
NoSQLおよびEISデータ・ソースには、Java Connector Architecture Common Client Interface (JCA CCI)をサポートするJava Connector Architecture (JCA)リソース・アダプタがあります。
NoSQLおよびEISデータ・ソースにアクセスする場合、多くの異なる方法があります。多くのNoSQLデータ・ソースで、Java APIが提供されています。EISデータ・ソースに対しては、サード・パーティ製およびカスタムの多くのJavaアダプタがあります。これらのAPIは、通常、非標準かつ低レベルで、JDBCに類似します。EclipseLinkのNoSQLサポートは、このようなAPIを基盤に作成され、高機能で高レベルな標準のJPA APIを提供しています。
一部のNoSQLデータ・ソースでは、JDBC APIと、SQL言語のサブセットがサポートされます。多くのサード・パーティ・ベンダーによって、EISデータ・ソース用のJDBCドライバが提供されています。EclipseLinkの通常のJPAサポートは、任意の準拠JDBCドライバで使用できます。つまり、JDBCアクセスがオプションの場合、EclipseLinkの標準JPAサポートを使用できるため、EclipseLinkのNoSQLサポートは必要ありません。
一部のNoSQLデータ・ソースでは、JCAがサポートされます。JCAは、JDBCより一般的なシステムに接続できるJava Enterprise Edition APIです。JCAは、リソース・アダプタ・レイヤーとCommon Client Interface (CCI)という2つの部分で構成されます。EclipseLinkのNoSQLおよびEISサポートは、JCA CCIに基づいています。MongoDB、Oracle NoSQL、XMLファイル、JMSおよびOracle AQについては、EclipseLinkにJCAアダプタと、EclipseLink EISPlatform
クラスおよびConnectionSpec
クラスが用意されています。サード・パーティのJCAアダプタも、CCIをサポートしている場合は、EclipseLinkとともに使用できます。Attunityなどのサード・パーティJCAベンダーでは、様々なEISデータ・ソース(IMS、VSAM、ADABASEなど)をサポートしています。
NoSQL永続性ユニットは、JPA永続性ユニットと同じように構成します。persistence.xml
ファイルを使用して、永続性ユニットを定義します。NoSQL永続性ユニットは、通常のJPA永続性ユニットと同じように、永続性を通じたアプリケーション管理、JTA管理、インジェクションまたは作成が可能です。NoSQL永続性ユニットには、必要とされる特定の永続性ユニット・プロパティがあり、一定の制限があります。
NoSQLでは、次の永続性ユニット・プロパティが定義されています。
eclipselink.nosql.connection-spec
eclipselink.nosql.connection-factory
eclipselink.nosql.property
eclipselink.target-database
: これを使用してNoSQLプラットフォーム・クラスを設定するか、汎用プラットフォームに対してorg.eclipse.persistence.eis.EISPlatform
を使用します。
これらのプロパティの詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』の永続性プロパティの拡張機能リファレンスに関する項を参照してください。
NoSQL永続性ユニットには、次の制限があります。
<jta-data-source>
、<non-jta-data-source>
: これらの要素は、JDBC DataSources
を参照するため、サポートされません。
JTA: JTA管理の永続性ユニットはサポートされますが、NoSQL JCAリソース・アダプタでJTAがサポートされないかぎり、XAトランザクションは提供されない場合があります。
javax.jdbc
、eclipselink.jdbc
: NoSQLではJDBCを使用しないため、JDBC固有のプロパティはサポートされません。
NoSQLプラットフォームを使用するには、接続指定クラス名をeclipselink.nosql.connection-spec
に、プラットフォーム・クラス名をeclipselink.target-database
に設定する必要があります。各NoSQLプラットフォームでは、eclipselink.nosql.property
を使用して設定できるプラットフォーム固有のプロパティもサポートされます。MongoDB、Oracle NoSQL、XML、JMSおよびOracle AQの値の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』の@NoSqlに関する項を参照してください。A.3項「非SQL標準データベースのサポート: NoSQL」も参照してください。
NoSQLデータへのマッピングは、EclipseLink @NoSql
注釈および<no-sql>
XML要素を通じて構成します。@NoSql
では、非リレーショナル・データへのマッピングとしてクラスを定義します。@NoSql
は、@Entity
または@Embeddable
クラスとともに指定できます。
@NoSql
注釈では、dataType
およびdataFormat
属性を定義します。dataType
属性は、エンティティの構造の名前で、dataType
の意味はNoSQLプラットフォームに依存します。MongoDBでは、これはJSON文書が格納されるコレクション名です。Oracle NoSQLでは、dataType
は主要なキー値の最初の部分です。XMLファイル・アダプタでは、これはファイル名です。
dataFormat
属性では、データが格納される場合の構造のタイプを指定します。dataFormat
属性は、DataFormatType
enum
によって定義されます。
@NoSql
注釈を使用してアプリケーションを構成する例は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』の@NoSqlに関する項を参照してください。
NoSQLでは、ほとんどのJPA注釈がサポートされますが、一部にリレーショナル・データのマッピングとは異なる制限があります。
サポートされるマッピング注釈:
@Entity
: NoSQLデータ・ストアのルート・レベル・オブジェクトを定義します。
@Embeddable
: 別のオブジェクトのデータ構造に埋め込まれたオブジェクトを定義します。
@Basic
、@Temporal
、@Enumerated
、@Lob
@Convert
、@Converter
、@TypeConverter
、@ObjectTypeConverter
@Access
、@Transient
、@Mutable
@Id
、@EmbeddedId
@GeneratedValue
、@UuidGenerator
@Version
: サポートされますが、バージョン書込み競合を検証するためにNoSQLデータ・ソースに依存します。
@Embedded
: ネストした構造として親のデータ構造に埋め込まれる参照を定義します。
@ElementCollection
: ネストした構造のリストとして親のデータ構造に埋め込まれる値または埋込み可能オブジェクトのコレクションを定義します。
@OneToOne
、@ManyToOne
: ソース・オブジェクトのデータ構造に外部キーとして格納される別のルート・レベル・オブジェクトに対するリレーションシップを定義します。
@OneToMany
、@ManyToMany
: ソース・オブジェクトのデータ構造に外部キーのリストとして格納される他のルート・レベル・オブジェクトのコレクションに対するリレーションシップを定義します。
@Inheritance
、@MappedSuperclass
、@ClassExtractor
@Cacheable
、@Cache
、@ReadOnly
、@Noncacheable
@NamedQuery
: 問合せに対応するNoSQLデータ・ソースでサポートされます。
@NamedNativeQuery
: ネイティブ問合せに対応するNoSQLデータ・ソースでサポートされます。問合せ言語は、SQLではなく、NoSQLデータ・ストアに固有です。
@EntityListeners
、@PrePersist
、@PreUpdate
、@PreRemove
、@PreLoad
、@PostPersist
、@PostUpdate
、@PostRemove
、@PostLoad
@Customizer
サポートされないマッピング注釈:
@Table
、@SecondaryTable
: オブジェクトは表にマップされないため、サポートされません(これは@NoSql
注釈でdataTypeによって置換されます)。
@Column
: データは表の列に格納されないため、@Field
を使用する必要があります(@Column
は使用できますが、単に名前が使用されます)。
@JoinColumn
: サポートされません(これは@JoinField
によって置換されます)。
@JoinTable
: 必要ではないか、サポートされません(OneToManyおよびManyToManyは、ソース・オブジェクトのデータ構造に埋め込まれたIDのコレクションとして格納されます)。
@CollectionTable
: 必要ではないか、サポートされません(ElementCollectionは、親オブジェクトのデータ構造に埋め込まれます)。
@MapKeyColumn
、@MapKeyClass
、@MapKeyJoinColumn
: 現在サポートされていません。
@OrderBy
、@OrderColumn
: 順序は一般的にオブジェクトのデータ構造によって管理されるため、通常は必要ではないか、サポートされません。
@SequenceGenerator
、@TableGenerator
: 直接サポートされません。
@AttributeOverride
、@AssociationOverride
: 継承ではサポートされますが、埋込みオブジェクトはリレーショナル・データの場合のようにフラット化されず、親オブジェクトのデータ構造でネストされるため、埋込みリレーションシップではサポートされないか、必要ではありません。
@JoinFetch
、@BatchFetch
: サポートされません。
NoSQLは、オブジェクトをXMLやJSONなどの構造化データにマップします。NoSQLは、埋込みデータ、埋込みコレクション、およびすべての既存のJPAマッピング注釈をサポートします。
NoSQLオブジェクトをマップするには、ID、マッピング、埋込みオブジェクト、リレーションシップおよびロックを定義する必要があります。詳細は、Oracle TopLinkのソリューション・ガイドのソリューションの実装に関する項を参照してください。
問合せがNoSQLでサポートされるかどうかは、使用しているNoSQLプラットフォームに応じて異なります。一部のNoSQLデータ・ソースでは、独自の問合せ言語を通じて動的問合せがサポートされますが、それ以外では問合せはまったくサポートされません。NoSQLでは次のタイプの問合せがサポートされます。
JPQL問合せ
ネイティブ問合せ
対話型問合せ
これらの問合せのサポートの詳細は、Oracle TopLinkのソリューション・ガイドの問合せの定義に関する項を参照してください。
JPAトランザクションAPIは、NoSQLデータ・ソースでサポートされます。一部のNoSQLデータ・ソースでは、トランザクションがサポートされないことがあるため、トランザクション・サポートのレベルはNoSQLプラットフォームに依存します。JTA永続性ユニットおよびトランザクションもサポートされますが、NoSQLアダプタがJTAに統合されていない場合、XAまたはトランザクション・サポートは使用できません。
NoSQLデータ・ソースでトランザクションがサポートされない場合、flush()
などのデータベースの変更は、直接データベースにコミットされ、rollback()
は何の効果もありません。コミット操作に失敗しても、エラーの前に書き込まれた正常な変更はロールバックされません。JPAは、通常、コミットまたはflush()
がコールされるまでデータベースに書込みを行わないため、永続性コンテキストによって提供される一定レベルのトランザクション・サポートが引き続き存在します。
JPA操作のpersist()
、merge()
およびremove()
がサポートされます。
MongoDB: トランザクションはサポートされません。
Oracle NoSQL: トランザクションはサポートされません。