1

私のセットアップは、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);
}
4

0 に答える 0