複数の永続ユニットの使い方
複数のJPA実装を使う場合や、複数のJDBC DataSourceを使う場合は、複数の永続ユニットを作成します。そして、それぞれの永続ユニットに対応するjpa.dicon
のコピーを用意し、jpa.dicon
からインクルードします。
persistence.xml
に複数の永続ユニットを定義します。<persistence> <persistence-unit name="persistenceUnit" transaction-type="JTA"> <jta-data-source>jdbc/dataSource</jta-data-source> ... </persistence-unit> <persistence-unit name="fooPersistenceUnit" transaction-type="JTA"> <jta-data-source>jdbc/dataSource</jta-data-source> ... </persistence-unit>
pu.dicon
を定義します。jpa.dicon
をコピーします。<components initializeOnCreate="true"> <include path="s2toplink-jpa.dicon"/> <component name="persistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider"> <property name="unitName">"persistenceUnit"</property> <property name="providerClassName"> "oracle.toplink.essentials.PersistenceProvider" </property> </component> <component name="entityManagerFactory" class="javax.persistence.EntityManagerFactory"> persistenceUnitProvider.entityManagerFactory </component> <component name="entityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"> <aspect pointcut="createNamedQuery"> <component class="org.seasar.toplink.jpa.aop.interceptors.S2TopLinkEntityManagerInterceptor"/> </aspect> </component> </components>
foo-pu.dicon
を定義します。jpa.dicon
をコピーし、次のようにします。<components initializeOnCreate="true"> <include path="s2toplink-jpa.dicon"/> <component name="fooPersistenceUnitProvider" class="org.seasar.framework.jpa.impl.ContainerPersistenceUnitProvider"> <property name="unitName">"fooPersistenceUnit"</property> <property name="providerClassName"> "oracle.toplink.essentials.PersistenceProvider" </property> </component> <component name="fooEntityManagerFactory" class="javax.persistence.EntityManagerFactory"> fooPersistenceUnitProvider.entityManagerFactory </component> <component name="fooEntityManager" class="org.seasar.framework.jpa.impl.TxScopedEntityManagerProxy"> <aspect pointcut="createNamedQuery"> <component class="org.seasar.toplink.jpa.aop.interceptors.S2TopLinkEntityManagerInterceptor"/> </aspect> </component> </components>
- jpa.diconを書き換え
pu.dicon
とfoo-pu.dicon
をインクルードします。<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd"> <components> <include path="pu.dicon"/> <include path="foo-pu.dicon"/> </components>
- エンティティマネージャーを使用するDaoのクラスはプロパティでオブジェクトを受け取ります。プロパティ名には使用したいエンティティマネージャーのコンポーネント名を使用してください。
public void setFooEntityManager(EntityManager fooEntityManager) { this.fooEntityManager = fooEntityManager; }
または、JPAのPersistenceContextアノテーションを使用してエンティティマネージャーを設定します。unitName要素には使用したい永続コンテキストの名称を指定してください。@PersistenceContext(unitName="fooPersistenceUnit") private EntityManager em