Sleep mode in emddable websphere container does not find java: comp / websphere / ExtendedJTATransaction

I have a Java EE application that uses Hibernate 4.2.7 as a continuity provider that runs Junit tests in a Websphere 8.0.0 embedded container. Access to the database works fine in a real (i.e. not built-in) instance of Websphere 8.0.0. Unit tests work on startup with OpenJPA instead of Hibernate. However, by running Junit tests with Hibernate, I get the following exception:

CNTR0020E: EJB threw an unexpected (non-declared) exception during invocation of method "getEntity" on bean "BeanId (embeddable # classes # SomeBean, null)". Exception data: org.hibernate.service.jndi.JndiException: Unable to lookup JNDI name [java: comp / websphere / ExtendedJTATransaction]
    at org.hibernate.service.jndi.internal.JndiServiceImpl.locate (JndiServiceImpl.java:68)
    at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter $ TransactionAdapter. (WebSphereExtendedJtaPlatform.java:156)
    at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter $ TransactionAdapter. (WebSphereExtendedJtaPlatform.java:152)
    at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter.getTransaction (WebSphereExtendedJtaPlatform.java:124)
    at org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform $ TransactionManagerAdapter.getStatus (WebSphereExtendedJtaPlatform.java:119)
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus (JtaStatusHelper.java:73)
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive (JtaStatusHelper.java:115)
    at org.hibernate.service.jta.platform.internal.TransactionManagerBasedSynchronizationStrategy.canRegisterSynchronization (TransactionManagerBasedSynchronizationStrategy.java:56)
    ... stripped ...

It seems that the WebsphereExtendedJtaPlatform implementation is trying to get the current transaction through a JNDI lookup, but it fails because this JNDI name does not exist in the inline container. Here is cut from org.hibernate.service.jta.platform.internal.WebsphereExtendedJtaPlatform:


public class TransactionAdapter implements Transaction {

    private TransactionAdapter() {
        if ( extendedJTATransaction == null ) {
            extendedJTATransaction = jndiService().locate( "java:comp/websphere/ExtendedJTATransaction" );
        }
    }
... stripped ...

The ExtendedJtaTransaction class itself exists in the class path inside com.ibm.ws.runtime.jar.

The settings in our persistence.xml file are as follows:

<persistence-unit name="BLA" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/BLA</jta-data-source>
<class>com.some.Entity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
  <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
  <property name="hibernate.archive.autodetection" value="class" />
  <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
  <property name="jta.UserTransaction" value="java:comp/UserTransaction" />
  <property name="hibernate.show_sql" value="true" />
  <property name="hibernate.format_sql" value="true" />
  <property name="hibernate.jdbc.fetch_size" value="100" />
  <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" />
</properties>

Does anyone have a solution for this? Thank!

+4
1

, . , hibernate.transaction.factory_class, , - hibernate.transaction.manager_lookup_class, , , . , bean . Hibernate.cfg.xml Hibernate WebSphere Application Server:

for container-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.CMTTransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>

for bean-managed transactions:

<property name="hibernate.transaction.factory_class">
    org.hibernate.transaction.JTATransactionFactory
</property>
<property name="hibernate.transaction.manager_lookup_class">
    org.hibernate.transaction.WebSphereExtendedJTATransactionLookup
</property>
<property name="jta.UserTransaction">
    java:comp/UserTransaction
</property >

jta.UserTransaction factory UserTransaction WebSphere.

hibernate.transaction.manager_lookup_class WebSphere WebSphere Application Server V6.x WebSphere Business Integration Server Foundation V5.1 . Hibernate ExtendedJTATransaction, WebSphere Business Integration Server Foundation V5.1 WebSphere Application Server V6.0. WebSphere ExtendedJTATransaction , Java EE 5 JTA 1.1.

0

All Articles