この章では、Oracle TopLinkで永続性ユニットのJARファイルを使用して、コンテナの外のアプリケーション(たとえば、Java Platform, Standard Edition (Java SEプラットフォーム)のアプリケーション)をテストする方法について説明します。
この章では、次の項目について説明します。
ユース・ケース
ユーザーがTopLinkを、(Java SEプラットフォームのアプリケーションなどの)コンテナの内外の両方で使用する必要があります。
解決方法
このソリューションでは、コンテナ外部でTopLinkを使用した場合の主な違いに焦点を当てています。
コンポーネント
TopLink 12c (12.1.2.0.0)以上。
注意: TopLinkのコア機能は、オープン・ソースのEclipse Foundationの永続性フレームワークであるEclipseLinkによって提供されています。EclipseLinkでは、Java Persistence API (JPA)、Java Architecture for XML Binding (JAXB)、および標準に基づいたその他の永続性テクノロジと、それらの標準の拡張が実装されます。TopLinkには、EclipseLinkのすべてに加え、Oracleの追加機能が含まれています。 |
(Oracle WebLogic Server、IBM WebSphereまたはGlassfishなどの)アプリケーション・サーバー
コンテナの外部にデプロイする場合は、javax.persistence.Persistence
クラスのcreateEntityManagerFactory
メソッドを使用して、エンティティ・マネージャ・ファクトリを作成します。このメソッドは、プロパティのMap
および永続性ユニットの名前を受け入れます。このメソッドに渡すプロパティは、persistence.xml
ファイル指定されているプロパティと組み合されます。追加のプロパティの場合もあれば、persistence.xml
ファイルに以前に指定したプロパティの値をオーバーライドする場合もあります。
ヒント: これは、コマンドラインなどのプログラム入力から取得したプロパティを設定する便利な方法です。 |
EntityManager
は、エンティティBeanを永続化したり、データベースからロードしたりするためのアクセス・ポイントです。通常は、Java Persistence API (JPA)コンテナで、データ・ソースとの通信が管理されます。ただし、JPA永続性ユニットに対してJTAデータ・ソースを使用している場合は、Java EEプログラムのコンテナのデータ・ソースからJDBC接続にアクセスできます。管理データ・ソースは使用できないので、プロパティをcreateEntityManagerFactory
に渡して、トランザクションの種類をJTA
からRESOURCE_LOCAL
に変更して、次のようにJDBC接続情報を定義します。
例17-1 トランザクションの種類の変更および接続情報の定義
import static org.eclipse.persistence.jpa.config.PersistenceUnitProperties.*; ... Map properties = new HashMap(); // Ensure RESOURCE_LOCAL transactions is used. properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name()); // Configure the internal EclipseLink connection pool properties.put(JDBC_DRIVER, "oracle.jdbc.OracleDriver"); properties.put(JDBC_URL, "jdbc:oracle:thin:@localhost:1521:ORCL"); properties.put(JDBC_USER, "user-name"); properties.put(JDBC_PASSWORD, "password"); properties.put(JDBC_READ_CONNECTIONS_MIN, "1"); properties.put(JDBC_WRITE_CONNECTIONS_MIN, "1"); // Configure logging. FINE ensures all SQL is shown properties.put(LOGGING_LEVEL, "FINE"); // Ensure that no server-platform is configured properties.put(TARGET_SERVER, TargetServer.None);
EntityManager
へのEclipseLinkの拡張へアクセスすることも可能です。
persistence.xml
ファイルは、JPAを使用した永続性のためのデプロイメント・ディスクリプタ・ファイルです。ここには、永続性ユニットを指定し、管理対象永続性クラス、オブジェクト/リレーション・マッピング、およびデータベース接続の詳細を宣言します。
persistence.xml
ファイルを構成するには、次の手順を実行します。
例17-2に、Java SEプラットフォーム構成(つまり、コンテナの外部)用のpersistence.xml
ファイルを示します。
例17-2 Java SE構成を指定するpersistence.xmlファイル
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0"> <persistence-unit name="my-app" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:orcl"/> <property name="javax.persistence.jdbc.user" value="scott"/> <property name="javax.persistence.jdbc.password" value="tiger"/> </properties> </persistence-unit> </persistence>
EntityManagerFactory
を使用すれば、データベースのEntityManager
インスタンスを効率的に作成できます。次の方法を使用して、(例17-2に示す)アプリケーションのEntityManagerFactory
をインスタンス化できます。
Persistence.createEntityManagerFactory("my-app");
プロパティ・マップを使用すると、デフォルトの永続性プロパティをオーバーライドしてコンテナ・デプロイメントを使用できます。
プロパティ・マップを使用するには、次の手順を実行します。
例17-3に、コンテナ・デプロイメントを使用するpersistence.xml
ファイルを示します。
例17-3 プロパティ・マップで使用するための、Java SE構成を指定するpersistence.xmlファイル
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence persistence_1_0.xsd" version="1.0"> <persistence-unit name="employee" transaction-type="RESOURCE_LOCAL"> <non-jta-data-source>jdbc/MyDS</non-jta-data-source> </persistence-unit> </persistence>
注意: コンテナの外でテストする際に、データ・ソースは使用できません。 |
例17-3に示されている永続性ユニットをコンテナの外でテストするには、Java SEプラットフォームのブートストラップAPIを使用する必要があります。例17-4に、このブートストラップを示すサンプル・コードを示します。
例17-4 サンプル構成
import static org.eclipse.persistence.config.PersistenceUnitProperties.*; ... Map properties = new HashMap(); // Ensure RESOURCE_LOCAL transactions is used. properties.put(TRANSACTION_TYPE, PersistenceUnitTransactionType.RESOURCE_LOCAL.name()); // Configure the internal connection pool properties.put(JDBC_DRIVER, "oracle.jdbc.OracleDriver"); properties.put(JDBC_URL, "jdbc:oracle:thin:@localhost:1521:ORCL"); properties.put(JDBC_USER, "scott"); properties.put(JDBC_PASSWORD, "tiger"); // Configure logging. FINE ensures all SQL is shown properties.put(LOGGING_LEVEL, "FINE"); properties.put(LOGGING_TIMESTAMP, "false"); properties.put(LOGGING_THREAD, "false"); properties.put(LOGGING_SESSION, "false"); // Ensure that no server-platform is configured properties.put(TARGET_SERVER, TargetServer.None);
EntityManagerFactory
を使用すれば、データベースのEntityManager
インスタンスを効率的に作成できます。次の方法を使用して、(例17-4に示す)アプリケーションのEntityManagerFactory
をインスタンス化できます。
Persistence. createEntityManagerFactory("unitName", "properties");
ウィービングは、コンパイル済のJavaクラスのバイトコードを操作する方法です。
EclipseLinkでは、遅延ロード、変更追跡、フェッチ・グループ、内部最適化など多くの機能にウィービングを使用し、Plain Old Java Object (POJO)クラスとJavaエンティティを拡張しています。
Java SE環境では、デフォルトでウィービングは無効です。これは、遅延1対1、多対1および基本のリレーションシップに影響を与える場合があります。また、パフォーマンスおよび属性変更トラッキングにも大きな影響があります。
Java SEでウィービングを有効にするには、Java VMの起動時にEclipseLinkエージェントを使用する必要があります。
java -javaagent:eclipselink.jar
Java SEでJPAウィービングを許可するには、Springを使用することも可能です。詳細は、http://wiki.eclipse.org/EclipseLink/Examples/JPA/JPASpring
を参照してください。
次の永続性プロパティを含めることにより、静的なウィービングを使用することも可能です。
<property name="eclipselink.weaving" value="static"/>
詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のウィービングに関する項を参照してください。
Java EE環境では、Java EE 5以降に完全に対応したアプリケーション・サーバー(Weblogic、Webspehere、Glassfishなど)ではデフォルトでウィービングは有効です。(JBossではウィービングを許可しないので、静的ウィービングまたはSpringを使用する必要があります)。
ウィービングを無効にするには、ウィービング永続性ユニット・プロパティを使用します。
<property name="eclipselink.weaving" value="false">
ウィービングの詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のウィービングに関する項を参照してください。
JPAデプロイメントの詳細は、JPA仕様の次の項(http://jcp.org/en/jsr/detail?id=317
)を参照してください。
7.2項「Bootstrapping in Java SE Environments」
第7章「Container and Provider Contracts for Deployment and Bootstrapping」