(事务不回滚)Spring数据,JTA,JPA,Wildfly10 [英] (Transaction not rolling back) Spring-data, JTA, JPA, Wildfly10

查看:180
本文介绍了(事务不回滚)Spring数据,JTA,JPA,Wildfly10的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我得到了这个问题一段时间,无法弄清楚我做错了什么。这里是上下文:


  • Spring 4.3.4.RELEASE

  • Spring-data-jpa 1.10 .6.RELEASE

  • Hibernate 5.2.5.Final

  • 我使用wildfly 10,从maven插件开始

  • 为JNDI查找正确配置了数据源
  • 使用spring-data和接口上的@Repository
  • 创建entityManagerFactory作为spring bean(LocalContainerEntityManagerFactoryBean)

  • 至于事务管理器,我尝试使用'tx:jta-transaction-manager'和spring bean(JtaTransactionManager)配置持久性。 xml

  • 启用'tx:annotation-driven'



类(SistemaBOImpl),它有一个@Repository注入(SistemaDAO)和一个交易行为的测试方法:

  @Service 
@Transactional(propagation = Propagation.SUPPORTS)
public class SistemaBOImpl extends AbstractBO< Sistema,Long>实现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); //第一次保存

save(new Sistema()); //第二次保存
} catch(Exception e){
throw new RuntimeException(e);
//抛出new BusinessException(e);
}
}
}

DAO

  @Repository 
@Transactional
public interface SistemaDAO扩展了DAO< Sistema,Long>,JpaRepository< Sistema,Long> {

问题是:
虽然2nd save won由于数据库的限制而无法完成(我故意这样做,第一次保存被提交并且数据被更改
我无法弄清楚它为什么不能全部回滚。
我做错了什么?!?



以下是我的其他配置文件:

applicationContext.xml

 < beans ... ommited命名空间地狱> 
< context:annotation-config />

< context:component-scan base-package =br.com.myco/>

< tx:jta-transaction-manager />

< tx:注解驱动的事务管理器=transactionManager/>

< jpa:repositories base-package =br.com.myco/>

< jee:jndi-lookup id =dataSourcejndi-name =java:jboss / datasources / Myco_DB/>

< bean id =entityManagerFactoryclass =org.springframework.orm.jpa.LocalContain erEntityManagerFactoryBean>
< property name =jtaDataSourceref =dataSource/>
< property name =jpaVendorAdapter>
< bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
< property name =databasevalue =MYSQL/>
< property name =showSqlvalue =true/>
< / bean>
< / property>
< property name =persistenceUnitNamevalue =tof/>
< property name =packagesToScanvalue =br.com.myco.tof/>
< / bean>



persistence.xml

 < persistence xmlns =http://xmlns.jcp.org/xml/ns/persistence 
xmlns:xsi =http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation =http://xmlns.jcp.org/xml/ns/persistence http ://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsdversion =2.1>
< persistence-unit name =mycotransaction-type =JTA>
< provider> org.hibernate.jpa.HibernatePersistenceProvider< / provider>
< jta-data-source> java:jboss / datasources / Myco_DB< / jta-data-source>
< class> br.com.abril.tof.domain.Sistema< / class>
< exclude-unlisted-classes> false< / exclude-unlisted-classes>
<属性>
< property name =hibernate.show_sqlvalue =false/>
< property name =hibernate.dialectvalue =org.hibernate.dialect.MySQL5Dialect/>
< property name =hibernate.transaction.jta.platformvalue =org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform/>
< property name =hibernate.transaction.manager_lookup_classvalue =org.hibernate.transaction.JBossTransactionManagerLookup/>
< / properties>
< / persistence-unit>



web.xml

 < web-app version =3.1...> 

< display-name> MyCO< / display-name>
< description> MyCO< / description>

<! - - Carrega Spring - >
< listener>
< listener-class> org.springframework.web.context.ContextLoaderListener< / listener-class>
< / listener>

< servlet>
< servlet-name> myco< / servlet-name>
< servlet-class> org.springframework.web.servlet.DispatcherServlet< / servlet-class>
1< / load-on-startup>
< / servlet>

< servlet-mapping>
< servlet-name> myco< / servlet-name>
< url-pattern> /< / url-pattern>
< / servlet-mapping>

< persistence-unit-ref>
< persistence-unit-ref-name> jpa / EntityManager< / persistence-unit-ref-name>
< persistence-unit-name> myco< / persistence-unit-name>
< / persistence-unit-ref>

< session-config>
< session-timeout> 60< / session-timeout>
< / session-config>
< / web-app>

Log / Stacktrace for 2nd save

 造成者:org.hibernate.HibernateException:无法在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。
在org.hibernate.id.enhanced.SequenceStyleGenerator.generate(SequenceStyleGenerator.java:412)在org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)

在org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
在org.hibernate.event.internal.DefaultPersistEventListener。 entityIsTransient(DefaultPersistEventListener.java:189)
在org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
在org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener。
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(本地方法)
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)
在org.springframework.orm.jpa.ExtendedEntityManagerCreator $ ExtendedEntityManagerInvo您可以使用以下代码:
at com.sun.proxy $ proxy $.bat(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
在java.lang.reflect.Method.invoke(方法。
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)$ b $ sun.reflect。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.refl在org.springframework.data.repository.core.support.RepositoryFactorySupport $ QueryExecutorMethodInterceptor.executeMethodOn ect.Method.invoke(Method.java:497)
(RepositoryFactorySupport.java:503)
。在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)
。在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
在org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
。在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation(TransactionInterceptor.j ava:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
在org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java: 96)**在org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179

。在org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
... 65 more


解决方案

明白了人们经常在调试过程中寻找交易配置上的缺陷,最后我发现我所有的业务都不是代理服务器。那么说,我认为这应该是春天配置我的豆问题,为了上帝的缘故:),是它。
我得到了这个spring-mvc配置错误(WEB-INF / myco-servlet.xml):

 < ; context:component-scan base-package =br.com.myco/> 
< mvc:annotation-driven />

请参阅 base-package ?它指向与我的applicationContext.xml中相同的包:

 < context:component-scan base-package = br.com.myco/> 

我只需将myco-servlet.xml中的配置更改为主mvc包:

 < context:component-scan base-package =br.com.myco.service/> 

工作得很好!

荣誉对于这个关于stackoverflow的问题也是关于这个问题的启示。 / p>

I got this problem for a while and can't figure out what I am doing wrong. Here is the context:

  • Spring 4.3.4.RELEASE
  • Spring-data-jpa 1.10.6.RELEASE
  • Hibernate 5.2.5.Final
  • I'm using wildfly 10, starting via maven plugin
  • configured datasource for JNDI lookup correctly
  • using spring-data with @Repository on interfaces
  • created entityManagerFactory as a spring bean (LocalContainerEntityManagerFactoryBean)
  • as for transaction manager, I tried to use both 'tx:jta-transaction-manager' and spring bean (JtaTransactionManager)
  • configured persistence.xml
  • enable 'tx:annotation-driven'

So, I got a @Service class (SistemaBOImpl) that has a @Repository injected (SistemaDAO) and a test method for transactional behavior:

    @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);
        }
    }
}

DAO

@Repository
@Transactional
public interface SistemaDAO extends DAO<Sistema, Long>, JpaRepository<Sistema, Long> {}

The problem is: Although 2nd save won't complete due to database constraints (and I did it on purpose, 1st save is commited and data is changed. I can't figure out why it is not rolling back all. What am I doing wrong?!?

Here are my other config file:

applicationContext.xml

<beans ... ommited namespace hell>
<context:annotation-config />

<context:component-scan base-package="br.com.myco" />

<tx:jta-transaction-manager />

<tx:annotation-driven transaction-manager="transactionManager" />

<jpa:repositories base-package="br.com.myco" />

<jee:jndi-lookup id="dataSource" jndi-name="java:jboss/datasources/Myco_DB" />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jtaDataSource" ref="dataSource" />
    <property name="jpaVendorAdapter" >
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
            <property name="database" value="MYSQL" />
            <property name="showSql" value="true" />
        </bean>
    </property>
    <property name="persistenceUnitName" value="tof"/>
    <property name="packagesToScan" value="br.com.myco.tof"/>
</bean>

persistence.xml

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1">
<persistence-unit name="myco" transaction-type="JTA">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <jta-data-source>java:jboss/datasources/Myco_DB</jta-data-source>
    <class>br.com.abril.tof.domain.Sistema</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform"/>
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
    </properties>
</persistence-unit>

web.xml

<web-app version="3.1" ...>

<display-name>MyCO</display-name>
<description>MyCO</description>

<!-- Carrega Spring -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>myco</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>myco</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<persistence-unit-ref>
    <persistence-unit-ref-name>jpa/EntityManager</persistence-unit-ref-name>
    <persistence-unit-name>myco</persistence-unit-name>
</persistence-unit-ref>

<session-config>
    <session-timeout>60</session-timeout>
</session-config>
</web-app>

Log/Stacktrace for 2nd save

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

解决方案

Got it folks!

After debugging for, like, a lot and searching for flaws on transaction configurations, I ended up seeing that all my Business weren't proxies. Well, that said I thought that it should be spring configuring my beans the issue and, for god sake :), was it. I got this spring-mvc config done wrong (WEB-INF/myco-servlet.xml):

<context:component-scan base-package="br.com.myco" />
<mvc:annotation-driven />

See the base-package? It was pointing to the same packages as in my applicationContext.xml:

<context:component-scan base-package="br.com.myco" />

I just had to change that config in myco-servlet.xml to the main mvc package:

<context:component-scan base-package="br.com.myco.service" />

And worked just fine!

Kudos for this question on stackoverflow also for the enlightment about the issue.

这篇关于(事务不回滚)Spring数据,JTA,JPA,Wildfly10的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆