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类(SistemaBOImpl),它注入了一个@Repository(SistemaDAO)和一个事务行为测试方法:

    @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" />