在Websphere上使用JPA / Hibernate时出现UnsupportedOperationException

时间:2014-01-17 22:14:00

标签: hibernate jpa websphere jta myeclipse

问题

尝试更新数据库中的记录时,我收到以下异常:

java.lang.UnsupportedOperationException
at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform$TransactionManagerAdapter.setRollbackOnly(WebSphereExtendedJtaPlatform.java:139)....

此更新仅在更新时发生。创建,阅读和删除工作正常。

抛出此代码的典型原因是什么?

奇怪的扭曲

我们需要使用MyEclipseBlue并且不使用Maven或ant来构建项目;只能使用MyEclipseBlue的构建过程。测试由MyEclipseBlue生成的EAR时抛出上述错误。当我将代码部署为Maven在命令行上生成的EAR时,上述异常不会被抛出

我已经付出了巨大的努力来验证所产生的战争是否相同,但很明显,我错过了一些东西。

环境

  • Websphere 8.5.5
  • MyEclipse Blue v10.x
  • Windows 7 x64

思想

我不相信这是类加载的问题,因为抛出异常的代码是在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

最后的想法

这两个耳朵会有什么不同会使不同的代码被调用?

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:-1)

在hibernate 4.3中尝试:

<property name="hibernate.transaction.jta.platform"
    value="org.hibernate.service.jta.platform.internal.WebSphereJtaPlatform" />

似乎工作

请注意,这使用WebSphereJtaPlatform而不是WebSphereExtendedJtaPlatform