Results 1 to 4 of 4

Thread: Problem when switching from HibernateTransactionMngr to JtaTransactionMngr

  1. #1
    Join Date
    Oct 2005
    Location
    Frankfurt/Main, Germany
    Posts
    9

    Default Problem when switching from HibernateTransactionMngr to JtaTransactionMngr

    I'm using Spring 1.2.5 with Hibernate3 and receive a strange behaviour when switching from HibernateTransactionManager to JtaTransactionManager (using JOTM and MySQL).

    In the first Place i'm using HibernateTransactionManager to inject into my LocalSessionFactoryBean. Further on there is a BusinessFacade (which is decoratet by TransactionProxyFactoryBean) which uses a DAO for Create and Retrieve-Operations. The DAO uses a simple Apache-DBCP-DataSource.

    Here's my config:

    <beans>

    <bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName"><value>com.mysql.jdbc.Drive r</value></property>
    <property name="url"><value>jdbc:mysql://localhost:3306/kreditrisiko</value></property>
    <property name="username"><value>magle</value></property>
    <property name="password"><value>mglmgl</value></property>
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSes sionFactoryBean">
    <property name="dataSource"><ref bean="datasource"/></property>
    <property name="mappingResources">
    <value>com/mgi/spring/domain/produkt/Produkt.hbm.xml,
    com/mgi/spring/domain/produkt/Cap.hbm.xml,
    com/mgi/spring/domain/stammvertrag/Stammvertrag.hbm.xml
    </value>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQ LDialect</prop>
    </props>
    </property>
    </bean>

    <bean id="ProduktDao" class="com.mgi.spring.domain.produkt.ProduktDao">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.Hibernat eTransactionManager">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
    </bean>

    <bean id="StammvertragDao" class="com.mgi.spring.domain.stammvertrag.Stammver tragDao">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
    </bean>

    <bean id="StammvertragServiceTarget" class="com.mgi.spring.domain.stammvertrag.Stammver tragService">
    <property name="stammvertragDao"><ref bean="StammvertragDao"/></property>
    </bean>

    <bean id="StammvertragService" class="org.springframework.transaction.interceptor .TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="transactionManager"/></property>
    <property name="target"><ref bean="StammvertragServiceTarget"/></property>
    <property name="transactionAttributes">
    <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="transfer*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    </beans>


    While having no problems with my UnitTests when using this config (refering to the DAO and Transaction-Decoratet BusinessService and calling any Methods) i've got an BadSqlGrammarException when switching Transaction-Management to JtaTransactionManager (with JOTM).
    There i'm using a XADataSource to connect to MySQL.

    Here's the adapted config:

    <beans>

    <bean id="jotm" class="org.springframework.transaction.jta.JotmFac toryBean"/>

    <bean id="jtaTransactionManager" class="org.springframework.transaction.jta.JtaTran sactionManager">
    <property name="userTransaction"><ref local="jotm"/></property>
    </bean>

    <bean id="innerMysqlDataSource" class="org.enhydra.jdbc.standard.StandardXADataSou rce" destroy-method="shutdown">
    <property name="transactionManager"><ref local="jotm"/></property>
    <property name="driverName"><value>com.mysql.jdbc.Driver</value></property>
    <property name="url"><value>jdbc:mysql://localhost:3306/spring</value></property>
    </bean>

    <bean id="mysqlDataSourceXA" class="org.enhydra.jdbc.pool.StandardXAPoolDataSou rce" destroy-method="shutdown">
    <property name="dataSource"><ref local="innerMysqlDataSource"/></property>
    <property name="maxSize"><value>5</value></property>
    <property name="minSize"><value>2</value></property>
    <property name="user"><value>magle</value></property>
    <property name="password"><value>mglmgl</value></property>
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSes sionFactoryBean">
    <property name="dataSource"><ref bean="mysqlDataSourceXA"/></property>
    <!-- <property name="jtaTransactionManager"><ref bean="jtaTransactionManager"/></property> -->
    <property name="mappingResources">
    <value>com/mgi/spring/domain/produkt/Produkt.hbm.xml,
    com/mgi/spring/domain/produkt/Cap.hbm.xml,
    com/mgi/spring/domain/stammvertrag/Stammvertrag.hbm.xml
    </value>
    </property>
    <property name="hibernateProperties">
    <props>
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQ LDialect</prop>
    </props>
    </property>
    </bean>

    <bean id="ProduktDao" class="com.mgi.spring.domain.produkt.ProduktDao">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
    </bean>

    <bean id="StammvertragDao" class="com.mgi.spring.domain.stammvertrag.Stammver tragDao">
    <property name="sessionFactory"><ref bean="sessionFactory"/></property>
    </bean>

    <bean id="StammvertragServiceTarget" class="com.mgi.spring.domain.stammvertrag.Stammver tragService">
    <property name="stammvertragDao"><ref bean="StammvertragDao"/></property>
    </bean>

    <bean id="StammvertragService" class="org.springframework.transaction.interceptor .TransactionProxyFactoryBean">
    <property name="transactionManager"><ref bean="jtaTransactionManager"/></property>
    <property name="target"><ref bean="StammvertragServiceTarget"/></property>
    <property name="transactionAttributes">
    <props>
    <prop key="add*">PROPAGATION_REQUIRED</prop>
    <prop key="transfer*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    </beans>

    When now running the same UnitTest i've got the mentioned Exception:

    org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not fetch initial value; bad SQL grammar [select max(pk_vertrag_id) from stammvertraege]; nested exception is java.sql.SQLException: Unknown column 'pk_vertrag_id' in 'field list'
    java.sql.SQLException: Unknown column 'pk_vertrag_id' in 'field list'
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:2921)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:15 70)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java :1665)
    at com.mysql.jdbc.Connection.execSQL(Connection.java: 2978)
    at com.mysql.jdbc.Connection.execSQL(Connection.java: 2902)
    at com.mysql.jdbc.PreparedStatement.executeInternal(P reparedStatement.java:930)
    at com.mysql.jdbc.PreparedStatement.executeQuery(Prep aredStatement.java:1024)
    at org.enhydra.jdbc.core.CorePreparedStatement.execut eQuery(CorePreparedStatement.java:92)
    at org.hibernate.id.IncrementGenerator.getNext(Increm entGenerator.java:89)
    at org.hibernate.id.IncrementGenerator.generate(Incre mentGenerator.java:45)
    at org.hibernate.event.def.AbstractSaveEventListener. saveWithGeneratedId(AbstractSaveEventListener.java :85)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventLi stener.saveWithGeneratedOrRequestedId(DefaultSaveO rUpdateEventListener.java:184)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventLi stener.entityIsTransient(DefaultSaveOrUpdateEventL istener.java:173)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventLi stener.performSaveOrUpdate(DefaultSaveOrUpdateEven tListener.java:96)
    at org.hibernate.event.def.DefaultSaveOrUpdateEventLi stener.onSaveOrUpdate(DefaultSaveOrUpdateEventList ener.java:69)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(Sessio nImpl.java:468)
    at org.hibernate.impl.SessionImpl.saveOrUpdate(Sessio nImpl.java:463)
    at org.springframework.orm.hibernate3.HibernateTempla te$18.doInHibernate(HibernateTemplate.java:671)
    at org.springframework.orm.hibernate3.HibernateTempla te.execute(HibernateTemplate.java:356)
    at org.springframework.orm.hibernate3.HibernateTempla te.saveOrUpdate(HibernateTemplate.java:668)
    at com.mgi.spring.domain.stammvertrag.StammvertragDao .store(StammvertragDao.java:52)
    at com.mgi.spring.test.stammvertrag.StammvertragServi ceTest.testBidirectionalAssociationProduktWithStam mvertragUsingJtaTransactionManager(StammvertragSer viceTest.java:215)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Nativ e Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknow n Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Un known Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.java:154 )
    at junit.framework.TestCase.runBare(TestCase.java:127 )
    at junit.framework.TestResult$1.protect(TestResult.ja va:106)
    at junit.framework.TestResult.runProtected(TestResult .java:124)
    at junit.framework.TestResult.run(TestResult.java:109 )
    at junit.framework.TestCase.run(TestCase.java:118)
    at junit.framework.TestSuite.runTest(TestSuite.java:2 08)
    at junit.framework.TestSuite.run(TestSuite.java:203)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRu nner.runTests(RemoteTestRunner.java:474)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRu nner.run(RemoteTestRunner.java:342)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRu nner.main(RemoteTestRunner.java:194)

    Right now, i have no clue where the problem is ...

    Any Help is highly appreciated :o)

    Thanks in advance ... Mario

  2. #2
    Join Date
    Aug 2004
    Posts
    1,104

    Default

    It looks like you are using two different databases - are they set up the same way?

    <property name="url"><value>jdbc:mysql://localhost:3306/kreditrisiko</value></property>

    <property name="url"><value>jdbc:mysql://localhost:3306/spring</value></property>
    Thomas Risberg
    SpringSource by Pivotal
    http://www.springsource.org

  3. #3
    Join Date
    Oct 2005
    Location
    Frankfurt/Main, Germany
    Posts
    9

    Thumbs up green bar

    oh man ... what a stupid failure by myself !!!

    This is another good example for an article 'clipboard considered harmful' ... ;o)

    (I've looked everywhere else (infrastructure) but in my own code ... and Mr. Hunt ist right - 'Select works most of the time' !!!)

    After pointing to the correct database my unittest now shows a green bar :o)

    Thank you very much !!!
    Last edited by magle; Nov 26th, 2005 at 12:29 PM.

  4. #4

    Default

    I found thay my simple stand-alone java class with main method doen't stop running after it reaches last line in code. It continue to stay in 'running' mode. What to do with that?
    I use hibernate+spring+JOTM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •