Hibernate (事务未回滚)Spring数据,JTA,JPA,Wildfly10
我有一段时间遇到这个问题,不知道我做错了什么。以下是上下文:Hibernate (事务未回滚)Spring数据,JTA,JPA,Wildfly10,hibernate,jpa,spring-data-jpa,wildfly,jta,Hibernate,Jpa,Spring Data Jpa,Wildfly,Jta,我有一段时间遇到这个问题,不知道我做错了什么。以下是上下文: 弹簧4.3.4.1释放 Spring数据jpa 1.10.6.1版本 Hibernate 5.2.5.1最终版本 我使用的是wildfly 10,从maven插件开始 为JNDI查找正确配置了数据源 在接口上使用带@Repository的spring数据 已将entityManagerFactory创建为Springbean(LocalContainerEntityManagerFactoryBean) 至于事务管理器,我尝试使用“
- 弹簧4.3.4.1释放
- Spring数据jpa 1.10.6.1版本
- Hibernate 5.2.5.1最终版本
- 我使用的是wildfly 10,从maven插件开始
- 为JNDI查找正确配置了数据源
- 在接口上使用带@Repository的spring数据
- 已将entityManagerFactory创建为Springbean(LocalContainerEntityManagerFactoryBean)
- 至于事务管理器,我尝试使用“tx:jta事务管理器”和Springbean(JtaTransactionManager)
- 配置的persistence.xml
- 启用“tx:注释驱动”
@Service
@Transactional(propagation = Propagation.SUPPORTS)
public class SistemaBOImpl extends AbstractBO<Sistema, Long> implements SistemaBO {
@Autowired
public SistemaBOImpl(SistemaDAO sistemaDAO) {
super(sistemaDAO);
}
@Override
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = { BusinessException.class })
public void testTrans() throws BusinessException {
try {
final Sistema s = findOne(1L);
s.setCodUsuAlt(SimpleDateFormat.getInstance().format(new Date()));
s.setDatAlt(new Date());
save(s); //1st save
save(new Sistema()); //2nd save
} catch (Exception e) {
throw new RuntimeException(e);
// throw new BusinessException(e);
}
}
}
检查您使用的MySQL引擎是否为InnoDB。如果您使用的是MyISAM,则不支持事务。检查您使用的MySQL引擎是否为InnoDB。如果您使用的是MyISAM,则不支持事务。明白了 在调试了很多事务配置并搜索了它们的缺陷之后,我发现我所有的业务都不是代理。嗯,也就是说,我认为应该是spring配置我的豆子的问题,看在上帝的份上,是的。 我把这个spring mvc配置搞错了(WEB-INF/mycoservlet.xml):
请参阅基本软件包?它指向与我的applicationContext.xml中相同的包:
<context:component-scan base-package="br.com.myco" />
我只需将myco-servlet.xml中的配置更改为主mvc包:
<context:component-scan base-package="br.com.myco.service" />
而且工作得很好
值得称赞的是,这也给了我们关于这个问题的启示。明白了,伙计们
在调试了很多事务配置并搜索了它们的缺陷之后,我发现我所有的业务都不是代理。嗯,也就是说,我认为应该是spring配置我的豆子的问题,看在上帝的份上,是的。
我把这个spring mvc配置搞错了(WEB-INF/mycoservlet.xml):
请参阅基本软件包?它指向与我的applicationContext.xml中相同的包:
<context:component-scan base-package="br.com.myco" />
我只需将myco-servlet.xml中的配置更改为主mvc包:
<context:component-scan base-package="br.com.myco.service" />
而且工作得很好
值得称赞的是,这也给了我们关于这个问题的启示。您有
rollboor=BusinessException.class
,但在发生错误时会抛出RuntimeException
。只有当该方法抛出一个BusinessException
时,才会发生自动回滚,但实际上没有,因此回滚不会发生(如预期的那样)。嗨,manish,我知道,这只是我做的许多测试中的一个。我尝试了:ommiting'rollboor'配置并抛出两个异常,我尝试将Runtime和BusinessException放在该配置上,等等……您是否可以调试应用程序以查看是否为测试启动了事务?您可以在TransactionInterceptor
中设置断点来检查这一点。拦截器拦截对为Spring托管bean生成的代理的调用。在Spring配置中(特别是
),代理将是SistemaBO
的一个实例(因为默认代理是JDK代理,代理接口不是类)。因此,除非SistemaBO
使用@Transactional
声明了一个testTrans
方法,否则测试运行时可能不会有事务运行。我用stacktrace更新了第二次保存的问题,它确实传入了TransactionInterceptor(我标记在中间)**在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)中,您拥有rollbackor=BusinessException.class
,但在发生错误时会抛出RuntimeException
。只有当该方法抛出一个BusinessException
时,才会发生自动回滚,但实际上没有,因此回滚不会发生(如预期的那样)。嗨,manish,我知道,这只是我做的许多测试中的一个。我尝试了:ommiting'rollboor'配置并抛出两个异常,我尝试将Runtime和BusinessException放在该配置上,等等……您是否可以调试应用程序以查看是否为测试启动了事务?您可以在TransactionInterceptor
中设置断点来检查这一点。拦截器拦截对为Spring托管bean生成的代理的调用。在Spring配置中(特别是
),代理将是SistemaBO
的一个实例(因为默认代理是JDK代理,代理接口不是类)。因此,除非SistemaBO
使用@Transactional
声明了一个testTrans
方法,否则测试运行时可能不会有事务运行。我用stacktrace更新了第二次保存的问题,它确实传入了TransactionInterceptor(我标记在中间)**在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)嗨,昆西,我正在使用InnoDB。您使用的引擎支持事务吗?嗯,我正在使用InnoDB。。。支持事务处理。另外,我保证MySQL自动提交设置为FALSE。嗨,昆西,我使用的是InnoDB。那么你使用的引擎支持事务吗?嗯,我使用的是InnoDB。。。支持事务处理。另外,我保证MySQL自动提交设置为FALSE。
Caused by: org.hibernate.HibernateException: Could not apply work
at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.doTheWorkInNewTransaction(JtaIsolationDelegate.java:112)
at org.hibernate.resource.transaction.backend.jta.internal.JtaIsolationDelegate.delegateWork(JtaIsolationDelegate.java:65)
at org.hibernate.id.enhanced.TableStructure$1.getNextValue(TableStructure.java:125)
at org.hibernate.id.enhanced.NoopOptimizer.generate(NoopOptimizer.java:40)
at org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:412)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:775)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:748)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:753)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347)
at com.sun.proxy.$Proxy63.persist(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
at com.sun.proxy.$Proxy63.persist(Unknown Source)
at org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:506)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:503)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:488)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:460)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
**at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)**
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 65 more
<context:component-scan base-package="br.com.myco" />
<mvc:annotation-driven />
<context:component-scan base-package="br.com.myco" />
<context:component-scan base-package="br.com.myco.service" />