11 非リレーショナル・データ・ソースの理解
非リレーショナル・データ・ソースには多くのタイプがあります。
これには、ドキュメント・データベース、キー/値ストア、および他の様々な非標準データベース(MongoDB、Cassandra、Google BigTableなど)が含まれます。この章では、主にNoSQLデータ・ストアについて説明します。NoSQLは、SQL標準をサポートしないデータベース・システムの類型です。EclipseLinkでは、Java Persistence API (JPA)を通じたNoSQLデータベースに対するJavaオブジェクトの永続化がサポートされます。EclipseLinkのネイティブAPIも、NoSQLデータベースでサポートされます。
NoSQLプラットフォームの概念
NoSQLは、SQL標準をサポートしないデータベース・システムの類型です。
NoSQLの類型は、アプリケーション・データベース、レガシー・データベース、メッセージ・システム、トランザクション処理モニター(IMS、VSAM、ADABASEなど)などのEnterprise Information Systems (EIS)を含めるように拡張できます。
EclipseLinkのNoSQLサポートには、次のものが含まれます。
-
MongoDB
-
Oracle NoSQL
-
XMLファイル
-
JMS
-
Oracle AQ
EclipseLinkによるNoSQLサポートの詳細は、「非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永続性ユニットについて
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を使用します。
これらのプロパティの詳細は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「Persistence Property Extensions Reference」を参照してください。
NoSQL永続性ユニットには、次の制限があります。
-
<jta-data-source>、<non-jta-data-source>: これらの要素は、JDBC DataSourcesを参照するため、サポートされません。
-
JTA: JTA管理の永続性ユニットはサポートされますが、NoSQL JCAリソース・アダプタでJTAがサポートされないかぎり、XAトランザクションは提供されない場合があります。
-
javax.jdbc、eclipselink.jdbc: NoSQLではJDBCを使用しないため、JDBC固有のプロパティはサポートされません。
NoSQLプラットフォーム用の永続性ユニット・プロパティ
NoSQLプラットフォームを使用するには、接続指定クラス名をeclipselink.nosql.connection-specに、プラットフォーム・クラス名をeclipselink.target-databaseに設定する必要があります。
各NoSQLプラットフォームでは、eclipselink.nosql.propertyを使用して設定できるプラットフォーム固有のプロパティもサポートされます。MongoDB、Oracle NoSQL、XML、JMSおよびOracle AQの値の詳細は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「@NoSql」を参照してください。「非SQL標準データベースのサポート: NoSQL」も参照してください。
NoSQLプラットフォームのJPAアプリケーションについて
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注釈を使用してアプリケーションを構成する例は、『Java Persistence API (JPA) Extensions Reference for EclipseLink』の「@NoSql」を参照してください。
JPA注釈に対するマッピングの制限
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オブジェクトのマッピングについて
NoSQLは、オブジェクトをXMLやJSONなどの構造化データにマップします。NoSQLは、埋込みデータ、埋込みコレクション、およびすべての既存のJPAマッピング注釈をサポートします。
NoSQLオブジェクトをマップするには、ID、マッピング、埋込みオブジェクト、リレーションシップおよびロックを定義する必要があります。詳細は、『Solutions Guide for EclipseLink』の「Implementing the Solution」を参照してください。
問合せおよびNoSQLプラットフォームについて
問合せがNoSQLでサポートされるかどうかは、使用しているNoSQLプラットフォームに応じて異なります。
一部のNoSQLデータ・ソースでは、独自の問合せ言語を通じて動的問合せがサポートされますが、それ以外では問合せはまったくサポートされません。NoSQLでは次のタイプの問合せがサポートされます。
-
JPQL問合せ
-
ネイティブ問合せ
-
対話型問合せ
これらの問合せのサポートの詳細は、『Solutions Guide for EclipseLink』の「Defining Queries」を参照してください。
トランザクションおよびNoSQLプラットフォームについて
JPAトランザクションAPIは、NoSQLデータ・ソースでサポートされます。
一部のNoSQLデータ・ソースでは、トランザクションがサポートされないことがあるため、トランザクション・サポートのレベルはNoSQLプラットフォームに依存します。JTA永続性ユニットおよびトランザクションもサポートされますが、NoSQLアダプタがJTAに統合されていない場合、XAまたはトランザクション・サポートは使用できません。
NoSQLデータ・ソースでトランザクションがサポートされない場合、flush()などのデータベースの変更は、直接データベースにコミットされ、rollback()は何の効果もありません。コミット操作に失敗しても、エラーの前に書き込まれた正常な変更はロールバックされません。JPAは、通常、コミットまたはflush()がコールされるまでデータベースに書込みを行わないため、永続性コンテキストによって提供される一定レベルのトランザクション・サポートが引き続き存在します。
JPA操作のpersist()、merge()およびremove()がサポートされます。
-
MongoDB: トランザクションはサポートされません。
-
Oracle NoSQL: トランザクションはサポートされません。