问题
尝试更新数据库中的记录时,我收到以下异常:
java.lang.UnsupportedOperationException
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:139)....
此更新仅在更新时发生。创建,阅读和删除工作正常。
抛出此代码的典型原因是什么?
奇怪的扭曲
我们需要使用MyEclipseBlue并且不使用Maven或ant来构建项目;只能使用MyEclipseBlue的构建过程。测试由MyEclipseBlue生成的EAR时抛出上述错误。当我将代码部署为Maven在命令行上生成的EAR时,上述异常不会被抛出。
我已经付出了巨大的努力来验证所产生的战争是否相同,但很明显,我错过了一些东西。
环境
思想
我不相信这是类加载的问题,因为抛出异常的代码是在hibernate-core.jar中。我还在Websphere的管理控制台中查看了类路径报告。
这不是JDBC查找问题 - 两个版本使用相同的方式连接到jndi资源。我现在同时部署它们(之前我只有一个或另一个)。
源文件
在每场战争中,beans.xml(对于CDI)和persistence.xml文件完全相同:
WEB-INF /类/ META-INF / persistenc.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="boss-persistence" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/boss</jta-data-source>
<properties>
<!--<property name="hibernate.hbm2ddl.auto" value="update"/>-->
<property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.show_sql" value="true"/>
</properties>
</persistence-unit>
</persistence>
堆栈跟踪
Caused by: java.lang.UnsupportedOperationException
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:139)
at org.hibernate.engine.transaction.internal.jta.CMTTransaction.markRollbackOnly(CMTTransaction.java:131)
at org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl.setRollbackOnly(TransactionCoordinatorImpl.java:306)
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.setRollbackOnly(SynchronizationCallbackCoordinatorImpl.java:127)
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorImpl.beforeCompletion(SynchronizationCallbackCoordinatorImpl.java:117)
at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:53)
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter$TransactionAdapter$1.invoke(WebSphereExtendedJtaPlatform.java:176)
at com.sun.proxy.$Proxy127.beforeCompletion(Unknown Source)
at com.ibm.ws.jtaextensions.SynchronizationCallbackWrapper.beforeCompletion(SynchronizationCallbackWrapper.java:66)
at com.ibm.tx.jta.impl.RegisteredSyncs.coreDistributeBefore(RegisteredSyncs.java:291)
at com.ibm.ws.tx.jta.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:153)
at com.ibm.ws.tx.jta.TransactionImpl.prePrepare(TransactionImpl.java:2369)
at com.ibm.ws.tx.jta.TransactionImpl.stage1CommitProcessing(TransactionImpl.java:577)
at com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionImpl.java:1015)
... 77 more
最后的想法
这两个耳朵会有什么不同会使不同的代码被调用?
感谢您提供任何帮助!
答案 0 :(得分:-1)
在hibernate 4.3中尝试:
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.WebSphereJtaPlatform" />
似乎工作
请注意,这使用WebSphereJtaPlatform
而不是WebSphereExtendedJtaPlatform
。