通过hibernate spring集成使用多事务管理器(基于注释)

通过hibernate spring集成使用多事务管理器(基于注释),hibernate,spring-annotations,transactional,transactionmanager,Hibernate,Spring Annotations,Transactional,Transactionmanager,我正在做一个项目,需要连接到oracle的一个数据库,从表中读取一些数据,然后在汇总数据后将它们放入mysql的第二个数据库中 我需要为这个项目使用事务管理器。所以我做了如下的事情: spring应用程序上下文.xml <tx:annotation-driven transaction-manager="oracleTransactionManager" proxy-target-class="true"/> <bean id="oracleTransactionManage

我正在做一个项目,需要连接到oracle的一个数据库,从表中读取一些数据,然后在汇总数据后将它们放入mysql的第二个数据库中

我需要为这个项目使用事务管理器。所以我做了如下的事情:

spring应用程序上下文.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);
    }
}
@Transactional
@限定符(“mysqlTransactionManager”)
公共类MysqlService{
public void saveAll(列出myEntities){
List baseEntities=(List)(List)myEntities;
myentiydao.saveAll(基本实体);
}
}
但问题是,当我运行此代码时,会出现以下错误:

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)
线程“thread-3”org.hibernate.HibernateException中的异常:如果没有活动事务,持久化无效
位于org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:341)
位于com.sun.proxy.$Proxy11.persist(未知源)
位于com.peykasa.sdp.messagesummerizer.datamodel.smsbox.dao.MysqlTaskMessageDAOImpl.save(MysqlTaskMessageDAOImpl.java:28)
位于com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService.saveAll(MysqlTaskMessageService.java:35)
位于com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService$$FastClassBySpringCGLIB$$894181ef.invoke()
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:157)上
位于org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:262)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)上
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
在com.peykasa.sdp.messagesummerizer.datamodel.mysql.service.MysqlTaskMessageService$$EnhancerBySpringCGLIB$$c16175a6.saveAll()上
在com.peykasa.sdp.messagesummerizer.lifecycle.DataSummarizerThread.run(DataSummarizerThread.java:66)
发生此错误的原因以及如何修复它

我使用了Spring4.0.5和Hibernate3.6.10


提前感谢,

事务管理器继续执行
@Transactional
而不是
@Qualifier

@Transactional("mysqlTransactionManager")

编辑

我刚刚用两个独立的事务管理器运行了一个测试(但不使用hibernate),它工作正常,正如预期的那样

您的
MySqlService
是否定义为
?Spring只有在管理对象实例时才能启动事务

启用
org.springframework.transaction
的跟踪级别日志记录以获取详细日志记录。这是我在调用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管理器

是的,MySqlService和OracleService都是bean,但我使用hibernate来处理jdbc。我认为我使用hibernate对春季很重要,因为TransactionManager的类型与您的不同。我说得对吗?这不应该有什么区别;正如我所说的,查看跟踪日志以发现问题。