2012-02-10 63 views
1

我有下面的代码。我希望继续执行,即使有异常JPA事务回滚停止

@Transactional(noRollbackFor={PersistenceException.class, PSQLException.class,SQLGrammarException.class}) 
public void executeQuery(String parameterName){ 
    Query query = objectManager.getEntityManager().createNativeQuery("SOME UPDATE QUERY"); 

    Map<String, String> paramMap = (Map) destTableMap.get(parameterName); 
    query.setParameter("xyz",5); 

    try{ 
     query.executeUpdate(); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
} 

,我收到是

Exception in thread "main" org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:476) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621) 
    at 
Caused by: javax.persistence.RollbackException: Transaction marked as rollbackOnly 
    at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:73) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:467) 
    ... 11 more 
+0

重复:http://stackoverflow.com/questions/1701750/how-to-prevent-jpa - 从轧回事务 – 2012-02-10 08:53:15

回答

1

the documentation的异常堆栈跟踪:

如果Session抛出异常,包括任何的SQLException, 立即回滚数据库事务,调用Session.close() ,丢弃该Session实例。会话的某些方法不会 使会话保持一致状态。 没有抛出异常Hibernate可以被视为可恢复。通过在finally块中调用close()来确保会话将会关闭 。

交易必须回滚。所以,如果你想继续执行,如果休眠抛出一个异常,你应该把在自己的事务的执行executeQuery方法,使用REQUIRES_NEW传播的@Transactional注解。这样,只有这个短交易会被回滚。

-1

我尝试使用以下方法来避免这种TransactionSystemException: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction;嵌套的例外是javax.persistence.RollbackException:事务标记为rollbackOnly

@Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) 
public String foo(Object obj, String tableName, BindingResult result) throws Exception 
{ 
    // put some code here 
}