Spring + Hibernate + JPA + 2数据库。默默地持续无法提交@Transactional注释

时间:2012-11-30 13:04:47

标签: spring hibernate jpa spring-mvc spring-transactions

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

我的服务方法似乎适用于读取(对于两个dbs)。但是持久化无法在数据库中插入数据 - 并且在日志中没有例外。看一下hibernate的sql输出,看起来它确实检索了新生成的id,但后来却没有插入 - 如果它没有显示在db中,也没有在日志文件中记录插入。在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);
}

0 个答案:

没有答案