1

我的设置是带有两个数据库的 Spring MVC 3.1、Hibernate 4.1。

我的服务方法似乎适用于读取(对于两个数据库)。但是持久化无法将数据插入到数据库中 - 并且日志中没有任何异常。查看 hibernate 的 sql 输出,它看起来确实检索了新生成的 id,但从未进行过插入 - 如果这样做,它不会显示在 db 中,也不会在日志文件中记录插入。在数据库中,我可以看到序列号增加了,但没有插入数据。我无法弄清楚我的配置有什么问题。希望有人有想法。

以下是配置文件中的相关部分

    <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>

我还确保两个各自的基础 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