Weblogic错误:由以下原因引起:weblogic.transaction.internal.AppSetRollbackOnlyException:在事务上调用setRollbackOnly

我正在将Jboss 7as的应用程序移植到Weblogic 12c。

到目前为止,我能够运行应用程序并在数据库中创建新记录。

但是,我只在尝试更新现有记录时才会收到以下错误;

Error committing transaction: javax.ejb.TransactionRolledbackLocalException: Error committing transaction: at weblogic.ejb.container.internal.EJBRuntimeUtils.throwTransactionRolledbackLocal(EJBRuntimeUtils.java:231) at weblogic.ejb.container.internal.EJBRuntimeUtils.throwEJBException(EJBRuntimeUtils.java:134) at weblogic.ejb.container.internal.BaseLocalObject.postInvoke1(BaseLocalObject.java:362) at weblogic.ejb.container.internal.BaseLocalObject.__WL_postInvokeTxRetry(BaseLocalObject.java:205) at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:46) ... Caused by: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction 

当我在事务是容器管理的无状态EJB中调用javax.persistence.EntityManager.merge(Object)时,会发生错误。

我最初的想法是容器在某处调用javax.transaction.UserTransaction.setRollbackOnly() ,所以我将EJB的事务管理更改为BMT并自己管理事务。 发生了同样的错误。

我怀疑我的Datasource或persistence.xml有问题。

下面是我的persistence.xml的属性

   org.hibernate.ejb.HibernatePersistence myDS         

请协助。

这是Weblogic JTA实现的默认行为。 要获取根exception,应将系统属性weblogic.transaction.allowOverrideSetRollbackReason设置为true

其中一个解决方案是将此行添加到/bin/setDomainEnv.cmd

set JAVA_OPTIONS=%JAVA_OPTIONS% -Dweblogic.transaction.allowOverrideSetRollbackReason=true

或者等价于/bin/setDomainEnv.sh linux