我正在开发一个项目,需要连接到oracle的一个数据库并从表中读取一些数据,然后汇总数据后将它们放入mysql的第二个数据库中。
我需要为这个项目使用事务管理器。所以我做了如下的事情:
spring-application-context.xml
<tx:annotation-driven transaction-manager="oracleTransactionManager" proxy-target-class="true"/>
<bean id="oracleTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="oracleSessionFactory"/>
<qualifier value="oracleTransactionManager"/>
</bean>
<bean id="mysqlTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="mysqlSessionFactory"/>
<qualifier value="mysqlTransactionManager"/>
</bean>
MysqlService.java
@Transactional
@Qualifier("mysqlTransactionManager")
public class MysqlService{
public void saveAll(List<myEntity> myEntities) {
List<BaseEntity> baseEntities = (List<BaseEntity>) (List<?>) myEntities;
myEntitiyDAO.saveAll(baseEntities);
}
}
但问题是,当我运行此代码时,出现以下错误:
Exception in thread "Thread-3" org.hibernate.HibernateException: persist is not valid without active transaction
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:341)
at com.sun.proxy.$Proxy11.persist(Unknown Source)
at com.peykasa.sdp.messagesummerizer.datamodel.smsbox.dao.MysqlTaskMessageDAOImpl.save(MysqlTaskMessageDAOImpl.java:28)
at com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService.saveAll(MysqlTaskMessageService.java:35)
at com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService$$FastClassBySpringCGLIB$$894181ef.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService$$EnhancerBySpringCGLIB$$c16175a6.saveAll(<generated>)
at com.peykasa.sdp.messagesummerizer.lifecycle.DataSummarizerThread.run(DataSummarizerThread.java:66)
为什么会出现此错误以及如何修复它?
我使用过 spring 4.0.5 和 hibernate 3.6.10。
提前致谢,
最佳答案
事务管理器继续@Transactional
不是@Qualifier
.
@Transactional("mysqlTransactionManager")
编辑
我刚刚使用两个单独的事务管理器进行了测试(尽管没有使用 hibernate),并且它工作正常,正如预期的那样。
你的MySqlService
是吗?定义为<bean/>
? Spring 只有管理对象实例才能启动事务。
打开 org.springframework.transaction
的 TRACE 级别日志记录以获得详细的日志记录。这是我在调用 2 个 bean 时看到的;一个使用默认的 tx 管理器;另一个使用显式的...
09:39:37.528 TRACE [main][org.springframework.transaction.support.TransactionSynchronizationManager] Initializing transaction synchronization
09:39:37.529 TRACE [main][org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for [org.springframework.integration.samples.jdbc.Foo.doIt]
09:39:37.529 TRACE [main][org.springframework.transaction.interceptor.TransactionInterceptor] Completing transaction for [org.springframework.integration.samples.jdbc.Foo.doIt]
09:39:37.530 TRACE [main][org.springframework.transaction.support.TransactionSynchronizationManager] Clearing transaction synchronization
09:39:40.700 TRACE [main][org.springframework.transaction.support.TransactionSynchronizationManager] Initializing transaction synchronization
09:39:40.700 TRACE [main][org.springframework.transaction.interceptor.TransactionInterceptor] Getting transaction for [org.springframework.integration.samples.jdbc.Bar.doIt]
09:39:40.700 TRACE [main][org.springframework.transaction.interceptor.TransactionInterceptor] Completing transaction for [org.springframework.integration.samples.jdbc.Bar.doIt]
09:39:40.701 TRACE [main][org.springframework.transaction.support.TransactionSynchronizationManager] Clearing transaction synchronization
我可以在调试器中看出每个都使用正确的 tx 管理器。
关于hibernate - 使用多个事务管理器与 hibernate-spring 集成(基于注释),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33408728/