私のセットアップは、2 つのデータベースを持つ Spring MVC 3.1、Hibernate 4.1 です。
私のサービスメソッドは、読み取りに対して(両方のデータベースに対して)正常に機能しているようです。しかし、永続化はデータベースにデータを挿入できず、ログにも例外はまったくありません。hibernate の sql 出力を見ると、新しく生成された ID を取得したように見えますが、挿入は行われませんでした。実行した場合、データベースに表示されず、挿入がログ ファイルに記録されませんでした。データベースでは、シーケンス番号が増加していることがわかりますが、データは挿入されていません。構成の何が問題なのかわかりませんでした。うまくいけば、誰かがアイデアを持っています。
以下は、構成ファイルの関連部分です
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
</bean>
<bean id="mgrFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSource">
<property name="packagesToScan" value="xxx.yyy" />
<property name="persistenceUnitName" value="puOne"/>
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
</property>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="txMgr"/>
<bean id="txMgr"
class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="mgrFactory">
</bean>
これはそのままでうまくいきます。私が今やりたいことは、別のデータベースを使用する機能を追加することです。そこで、別のデータ ソース、エンティティ マネージャー ファクトリ、およびトランザクション マネージャーを追加しました。
<bean id="dataSourceTwo" class="org.apache.commons.dbcp.BasicDataSource">
</bean>
<bean id="mgrFactoryTwo"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:dataSource-ref="dataSourceTwo">
<property name="packagesToScan" value="xxx.zzz" />
<property name="persistenceUnitName" value="puTwo"/>
<property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
</property>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="txMgrTwo"/>
<bean id="txMgrTwo"
class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="mgrFactoryTwo">
</bean>
また、2 つのそれぞれのベース DAO がエンティティ マネージャーに次のようなユニット名で注釈を付けていることも確認しました。
@PersistenceContext(unitName = "puOne")
protected EntityManager entityManager;
私が最後にしたことは、サービス内の @Transactional アノテーション内にトランザクションマネージャー名を追加することでした
@Override
@Transactional(value="txMgrTwo" propagation = Propagation.REQUIRED)
public boolean create(User user) {
userDao.persist(user);
}