我有一个带有javax.transaction.RollbackException
的堆栈跟踪:
[...]引起: ch.ethz.id.wai.lakshmi.engine.common.LakshmiException:错误 处理用户交易。在 ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:79) 在 ch.ethz.id.wai.lakshmi.stdcmp.persistency.StandardPersistency.registerOrder(StandardPersistency.java:110) 引起:javax.transaction.RollbackException:标记为的事务 回滚。在 com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:473) 在 com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:855) 在 com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:208) 在 ch.ethz.id.wai.lakshmi.engine.common.TransactionHelper.commitTransaction(TransactionHelper.java:74)
在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316) 在 org.hibernate.ejb.AbstractEntityManagerImpl $ CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1510) 在 org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:109) 在 org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53) 在 com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435)
在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81) 在com.sun.proxy。$ Proxy233.executeUpdate(未知来源)at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:56) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3028) 在 org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3469) 在 org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88) 在org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 在 org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275) 在 org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 在 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402) 在 org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439)at at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395)at at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802)at at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)at at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)at at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)at at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205) 在 oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1307) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449) 在 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530) 在 oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1350) 在 com.sun.gjc.spi.base.PreparedStatementWrapper.executeUpdate(PreparedStatementWrapper.java:125) 在 org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
RollbackException
有一个我可以在调试时看到的原因:
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:ORA-22295:无法绑定 1个语句中超过4000字节的数据到LOB和LONG列
又由
引起org.hibernate.exception.GenericJDBCException:ORA-22295:无法绑定 1个语句中超过4000字节的数据到LOB和LONG列
但是RollbackExeption
的原因没有显示在堆栈跟踪中(这样可以简化错误的调试)。
知道原因吗?
修改
我在测试方法(JUnit)中添加了一个try-catch:
@Test
public void foo() throws Throwable {
try {
// test code generating the exception
} catch ( Exception e ) {
// here the exception cause is still there
}
由于这个方法是由JUnit直接调用的,所以当它离开我的代码时异常仍然可以。
答案 0 :(得分:0)
如果您希望在例外中显示原因,我想您唯一的机会是在Glassfish
打开错误/改进请求。我查看了JavaEETransactionImpl的源代码,这是RollbackException
被抛出的位置,而第473行代码是:
rbe = new RollbackException(sm.getString("enterprise_distributedtx.mark_rollback"));
正如您所看到的,我正在查看版本3.1.1
,因此如果您有不同的版本,请查看正确的源代码(我怀疑它会有所不同)。
答案 1 :(得分:0)
问题是Ant错误地过滤了部分异常跟踪
filtertrace从错误和失败堆栈跟踪中筛选出Junit和Ant堆栈帧。
默认为on
,但它不仅会过滤Junit和Ant帧:将其设置为关闭回滚原因。