2

I have recently updated to Hibernate 4.2.8.Final and also tried 4.3.1.Final however, I have started experiencing the following exception when using a find method in a transactional context using the spring framework 3.1 . I am using the Bitronix transaction manager 2.4.3. I am not sure whether I am using hibernate in the correct manner but as i described, this problem only started after the update of the hibernate version.

Caused by: org.hibernate.exception.GenericJDBCException: could not prepare statement
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:196)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.prepareQueryStatement(AbstractLoadPlanBasedLoader.java:257)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeQueryStatement(AbstractLoadPlanBasedLoader.java:201)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:137)
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.executeLoad(AbstractLoadPlanBasedLoader.java:102)
    at org.hibernate.loader.entity.plan.AbstractLoadPlanBasedEntityLoader.load(AbstractLoadPlanBasedEntityLoader.java:186)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:4120)
    at org.hibernate.event.internal.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:502)
    at org.hibernate.event.internal.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:467)
    at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:212)
    at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:274)
    at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
    at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1066)
    at org.hibernate.internal.SessionImpl.access$2000(SessionImpl.java:176)
    at org.hibernate.internal.SessionImpl$IdentifierLoadAccessImpl.load(SessionImpl.java:2533)
    at org.hibernate.internal.SessionImpl.get(SessionImpl.java:1019)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.find(AbstractEntityManagerImpl.java:1104)
    ... 76 more
Caused by: java.sql.SQLException: error enlisting a JdbcConnectionHandle of a JdbcPooledConnection from datasource defaultDataSource in state ACCESSIBLE with usage count 1 wrapping a JDBC LrcXAConnection on com.mysql.jdbc.JDBC4Connection@11d1bb73 on a JDBC LrcConnectionHandle on a JDBC LrcXAResource in state NO_TX
    at bitronix.tm.resource.jdbc.JdbcConnectionHandle.enlistResource(JdbcConnectionHandle.java:87)
    at bitronix.tm.resource.jdbc.JdbcConnectionHandle.prepareStatement(JdbcConnectionHandle.java:242)
    at sun.reflect.GeneratedMethodAccessor43.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at bitronix.tm.resource.jdbc.BaseProxyHandlerClass.invoke(BaseProxyHandlerClass.java:64)
    at com.sun.proxy.$Proxy23.prepareStatement(Unknown Source)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186)
    ... 93 more
Caused by: bitronix.tm.internal.BitronixSystemException: cannot enlist more than one non-XA resource, tried enlisting an XAResourceHolderState with uniqueName=defaultDataSource XAResource=a JDBC LrcXAResource in state NO_TX with XID null, already enlisted: an XAResourceHolderState with uniqueName=defaultDataSource XAResource=a JDBC LrcXAResource in state STARTED (started) with XID a Bitronix XID [737072696E672D62746D0000000023E25108000007C6 : 737072696E672D62746D0000000023E2510F000007CC]
    at bitronix.tm.internal.XAResourceManager.enlist(XAResourceManager.java:107)
    at bitronix.tm.BitronixTransaction.enlistResource(BitronixTransaction.java:130)
    at bitronix.tm.resource.common.TransactionContextHelper.enlistInCurrentTransaction(TransactionContextHelper.java:69)
    at bitronix.tm.resource.jdbc.JdbcConnectionHandle.enlistResource(JdbcConnectionHandle.java:85)
    ... 101 more

persistence.xml configuration:

<persistence-unit name="default" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>default</jta-data-source>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
</persistence-unit>

Spring dataSource and bitronix configuration:

<bean id="defaultDataSource" class="bitronix.tm.resource.jdbc.PoolingDataSource"
    depends-on="transactionManager" init-method="init" destroy-method="close">
    <property name="className" value="bitronix.tm.resource.jdbc.lrc.LrcXADataSource" />
    <property name="uniqueName" value="defaultDataSource" />
    <property name="minPoolSize" value="${ds.default.minPoolSize}" />
    <property name="maxPoolSize" value="${ds.default.maxPoolSize}" />
    <property name="maxIdleTime" value="${ds.default.maxIdleTime}" />
    <property name="useTmJoin" value="true" />
    <property name="deferConnectionRelease" value="true" />
    <property name="automaticEnlistingEnabled" value="true" />
    <property name="allowLocalTransactions" value="true" />
    <property name="isolationLevel" value="READ_COMMITTED" />
    <property name="shareTransactionConnections" value="false"/>
    <property name="driverProperties">
        <props>
            <prop key="driverClassName">${ds.default.driverClass}</prop>
            <prop key="url">${ds.default.url}</prop>
            <prop key="user">${ds.default.user}</prop>
            <prop key="password">${ds.default.password.encrypted}</prop>
        </props>
    </property>
</bean>

<bean id="bitronixConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices">
    <property name="serverId" value="spring-btm" />
    <property name="logPart1Filename" value="${catalina.base}/logs/tlog/btm1.tlog" />
    <property name="logPart2Filename" value="${catalina.base}/logs/tlog/btm2.tlog" />
    <property name="defaultTransactionTimeout" value="600" />
    <property name="warnAboutZeroResourceTransaction" value="false" />
    <property name="journal" value="null" />
</bean>

<bean id="bitronixTransactionManager" class="bitronix.tm.TransactionManagerServices"
      factory-method="getTransactionManager" destroy-method="shutdown" depends-on="bitronixConfig" />
aseychell
  • 1,794
  • 17
  • 35
  • It seems your datasources are not configured well: the XA-one is not properly set, so you get this error as JTA can't work with two non-XA sources (it is possible with one only), can you add the spring configuration of your datasources with Bitronix transaction manager? – zenbeni Apr 14 '14 at 09:51
  • I included the spring configuration and persistence.xml being used. – aseychell Apr 14 '14 at 09:59
  • Make sure also that you use the JDBC drivers that support XA. – V G Apr 14 '14 at 10:02
  • @AndreiI is right: check ds.default.driverClass and see if it is indeed a XA driver. – zenbeni Apr 14 '14 at 10:03
  • As noted in the question - this setup used to work with the older version of hibernate but not with the most recent versions so JDBC drivers should not be the issue here. We are using the MySQL connector version 5.1.25 – aseychell Apr 14 '14 at 10:07
  • @aseychell Can you print the value of the property ${ds.default.driverClass}? You have to use a driverClass XA-compliant – Angelo Immediata Apr 14 '14 at 10:08
  • ds.default.driverClass=com.mysql.jdbc.Driver – aseychell Apr 14 '14 at 10:08
  • 1
    You should use a XA driver; try with com.mysql.jdbc.jdbc2.optional.MysqlXADataSource – Angelo Immediata Apr 14 '14 at 10:10
  • Thanks everyone for your help, however I have a clarification. The setup that we are currently using is Bitronix with a single NON-TX datasource and no TX sources. Bitronix allows a single NON-TX datasource and we are using it this way as an optimisation where a single data source is being used. – aseychell Apr 14 '14 at 12:52

1 Answers1

0

The provider class changed from org.hibernate.ejb.HibernatePersistence to org.hibernate.jpa.HibernatePersistenceProvider in new version of Hibernate check if this is solving your problem.

Bassem Reda Zohdy
  • 12,662
  • 3
  • 33
  • 39