0

我有一个堆栈跟踪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.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:109) 的 org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:109) 的 org.hibernate.ejb.AbstractEntityManagerImpl$CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1510)。 com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:435) 上的 transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53)

在 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(Unknown Source) 在 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) at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88) at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) at 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.internal.SessionImpl.flush(SessionImpl.java:1213) 在 org.hibernate.internal.SessionImpl 的 org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)。 org.hibernate.engine.transaction.synchronization.internal 上的 managedFlush(SessionImpl.java:402)。SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:104)

在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:439) 在 oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:395) 在 oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:802 ) 在 oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436) 在 oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 在 oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java: 521) 在 oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1008) 在 oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java) 的 oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205) :1307) 在 oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3530) 在 oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449) 在 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 直接调用的,所以当它离开我的代码时仍然可以。

在此处输入图像描述

4

2 回答 2

0

如果您希望在异常中显示原因,我想您唯一的机会是在Glassfish. 我查看了JavaEETransactionImpl的源代码,这RollbackException是抛出的地方,在第 473 行代码是:

rbe = new RollbackException(sm.getString("enterprise_distributedtx.mark_rollback"));

如您所见,我正在检查版本3.1.1,所以如果您有不同的版本,请查看正确的源代码(我怀疑无论如何都会有所不同)。

于 2013-03-14T08:33:39.077 回答
0

问题是 Ant 错误地过滤了异常跟踪的一部分

Junit 任务文档

filtertrace 从错误和故障堆栈跟踪中过滤掉 Junit 和 Ant 堆栈帧。

它默认为on但它不仅过滤 Junit 和 Ant 帧:显示将其设置为关闭回滚的原因。

于 2013-03-14T09:54:19.813 回答