意外回滚异常 - JTA事务意外回滚

4
当我运行以下代码时,我得到的是UnexpectedRollbackException而不是ArrayIndexOutOfBoundsException。
环境:Weblogic、Spring、Hibernate、JTA和EJB。
代码:
public class ServiceImpl    
{        
    @Transactional  
    public void test()  
    {                   
        throw new ArrayIndexOutOfBoundsException();                 
    }   
}



public class WebLayerClass  
{           
    service.test(); 
}  

日志:

Caused by: org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is weblogic.transaction.RollbackException: setRollbackOnly called on transaction
    at org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1024) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:478) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:272) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) ~[spring-tx-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.0.3.RELEASE.jar:4.0.3.RELEASE]
    at com.sun.proxy.$Proxy261.update(Unknown Source) ~[na:na]
    at de.unicreditgroup.esa.service.webtool.sql.WebToolSqlServiceImpl.updateSqlQuery(WebToolSqlServiceImpl.java:234) ~[de-unicreditgroup-esa-services-2.1.0-SNAPSHOT.jar:na]
2个回答

1
当您在数据库中声明了非空字段,并且在使用JPA保存实体时该字段为空时,事务会自动回滚。

1
我猜这是由于Hibernate在你的异常上添加了包装器。因为你试图在事务中抛出RunTimeException,Hibernate将其转换为自己的UnexpectedRollbackException异常。
参见:异常文档

非常感谢您的回复。我有不同的业务案例需要在Web层中执行,基于服务异常情况。因此,在这种情况下,带有“ArrayIndexOutOfBoundsException”的catch块将无法捕获“UnexpectedRollbackException”。我该如何取消封装异常?框架没有自动取消封装吗? - Raghu ram
对于jta,在Spring中似乎是一个未解决的问题 https://jira.spring.io/browse/SPR-9053 - Raghu ram
你能否支持我添加一个解包的临时方案并捕获异常。 - Raghu ram
有相同的问题。有什么方法可以防止Hibernate包装我们自定义的异常吗? - Adarsh D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接