-
Nov 26th, 2005, 11:44 AM
#1
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
-
Nov 26th, 2005, 12:11 PM
#2
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>
-
Nov 26th, 2005, 12:24 PM
#3
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.
-
Jan 9th, 2006, 01:42 PM
#4
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
-
Forum Rules