Atomikos Community ForumNot for product support. If you need urgent help with your project then buy development or production support or check the known problems... Only registered users can post (registration is free). Problems registering? Send an email to support@atomikos.com to get help. |
|
Hi,
I'm trying to configure Hibernate to use Atomikos as the transaction manager. The documentation states so set the Hibernate parameters: transaction.manager_lookup_class=com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup transaction.factory_class=com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory But when I run my application, the log contains lots of warnings like: Cannot join transaction: do not override hibernate.transaction.factory_class I searched this forum and found a couple of topics like http://fogbugz.atomikos.com/default.asp?community.6.1085.2#discussTopic1086 but none of them have a solution. To get rid of these warnings, I changed "transaction.factory_class" to "org.hibernate.ejb.transaction.JoinableCMTTransactionFactory". I'm not sure if this is the right solution. If it was, what's the purpose of Atomikos' transaction factory anyway? It is a bit frustrating because this ia the very basic configuration of JPA/Hibernate and I cannot get it to run smoothly. Versions: - Atomikos Transactions Essentials 3.6.4 - Hibernate 3.5.0-Final (tried 3.3.2 before - same result) - Spring 3.0.2 - JDK 1.6.0_19 Thanks in advance! Stephan
Hi,
Yes, recent versions of Hibernate have some extra JNDI dependencies (JBoss is an appserver vendor, not sure if that is the reason;-) We are working on that. Spring's LocalSessionFactory also has a setJtaTransactionManager injector method. Might be an alternative for the time being? HTH
Hi,
thanks for your fast response! Unfortunately, I cannot use the setJtaTransactionManager method because I use JPA and Spring's LocalContainerEntityManagerFactoryBean that does not have this method. Until a new version of Atomikos is released, is it ok to use the JoinableCMTTransactionFactory? Cheers, Stephan
I am using Spring 3.0.2 + Hibernate 3.5.0-Final in JPA Mode.
All i had to set is transaction.manager_lookup_class, the Factory does not need to be specified - it should work without (i did not face any problem yet let hibernate use its own default jta factory here - must not be "true" in any case, but give it a try).
Not sure if I agree here - according to the Hibernate sources, the default Hibernate transaction factory will not work properly. At least: I don't see how it can use Atomikos because it cannot find our JTA objects. So I would suspect that you're not really using JTA for the Hibernate JDBC access...
I did not specify any factory - but looking at hibernate debug output it show this:
2010-04-15 14:46:40,736 [main] INFO org.hibernate.transaction.TransactionFactoryFactory - Transaction strategy: org.hibernate.ejb.transaction.JoinableCMTTransactionFactory 2010-04-15 14:46:40,738 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - instantiating TransactionManagerLookup: com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup 2010-04-15 14:46:40,740 [main] INFO org.hibernate.transaction.TransactionManagerLookupFactory - instantiated TransactionManagerLookup So it uses the JoinableCMTTransactionFactory by default - which seems to work - shouldn't it? 2010-04-15 14:46:42,520 [main] DEBUG org.hibernate.ejb.AbstractEntityManagerImpl - Looking for a JTA transaction to join 2010-04-15 14:46:42,531 [main] DEBUG org.hibernate.jdbc.JDBCContext - successfully registered Synchronization So its actually using the JTA Transaction already there.
Some more about inserting one JPA Entity:
2010-04-15 16:07:34,926 [main] INFO org.springframework.transaction.jta.JtaTransactionManager - Using JTA UserTransaction: com.atomikos.icatch.jta.J2eeUserTransaction@2fa847df 2010-04-15 16:07:34,926 [main] INFO org.springframework.transaction.jta.JtaTransactionManager - Using JTA TransactionManager: com.atomikos.icatch.jta.UserTransactionManager@510699ea 2010-04-15 16:07:35,244 [Thread-3] INFO atomikos - MessageConsumerSession: Starting JMS listener thread. 2010-04-15 16:07:35,263 [Thread-3] INFO atomikos - AtomikosConnectionFactoryBean 'jmsFactory1': createConnection()... 2010-04-15 16:07:35,263 [Thread-3] INFO atomikos - AtomikosConnectionFactoryBean 'jmsFactory1': init... 2010-04-15 16:07:35,263 [Thread-3] INFO atomikos - AtomikosConnectionFactoryBean 'jmsFactory1': getReference()... 2010-04-15 16:07:35,265 [Thread-3] INFO atomikos - AtomikosConnectionFactoryBean 'jmsFactory1': initializing with [ xaConnectionFactory=org.apache.activemq.ActiveMQXAConnectionFactory@2569a1c5, xaConnectionFactoryClassName=null, uniqueResourceName=jmsFactory1, maxPoolSize=10, minPoolSize=1, borrowConnectionTimeout=30, maxIdleTime=60, reapTimeout=0, maintenanceInterval=60, xaProperties=[], localTransactionMode=false] 2010-04-15 16:07:35,280 [main] INFO atomikos - createCompositeTransaction ( 900000 ): created new ROOT transaction with id com.atomikos.spring.jdbc.tm-dev0000100069 2010-04-15 16:07:35,321 [main] DEBUG org.hibernate.impl.SessionImpl - opened session at timestamp: 12713404552 2010-04-15 16:07:35,321 [main] DEBUG org.hibernate.ejb.AbstractEntityManagerImpl - Looking for a JTA transaction to join 2010-04-15 16:07:35,325 [main] DEBUG org.hibernate.jdbc.JDBCContext - successfully registered Synchronization 2010-04-15 16:07:35,343 [main] DEBUG org.hibernate.event.def.AbstractSaveEventListener - executing identity-insert immediately 2010-04-15 16:07:35,344 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to open PreparedStatement (open PreparedStatements: 0, globally: 0) 2010-04-15 16:07:35,344 [main] DEBUG org.hibernate.jdbc.ConnectionManager - opening JDBC connection 2010-04-15 16:07:35,344 [main] DEBUG org.hibernate.SQL - insert into TestEntity (id, text, value) values (null, ?, ?) 2010-04-15 16:07:35,346 [main] INFO atomikos - AtomikosDataSoureBean 'h2jdbc': getConnection ( null )... 2010-04-15 16:07:35,346 [main] INFO atomikos - AtomikosDataSoureBean 'h2jdbc': init... 2010-04-15 16:07:35,346 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling toString... 2010-04-15 16:07:35,346 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling toString... 2010-04-15 16:07:35,346 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling getAutoCommit... 2010-04-15 16:07:35,351 [main] INFO atomikos - addParticipant ( XAResourceTransaction: 636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657630303030313030303639:636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657631 ) for transaction com.atomikos.spring.jdbc.tm-dev0000100069 2010-04-15 16:07:35,351 [main] INFO atomikos - XAResource.start ( 636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657630303030313030303639:636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657631 , XAResource.TMNOFLAGS ) on resource h2jdbc represented by XAResource instance xads0: url=jdbc:h2:mem:h2TestDB;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE user=h2TestDB 2010-04-15 16:07:35,352 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling prepareStatement... 2010-04-15 16:07:35,354 [main] DEBUG org.hibernate.id.IdentifierGeneratorHelper - Natively generated identity: 1 2010-04-15 16:07:35,355 [main] DEBUG org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 2010-04-15 16:07:35,355 [main] DEBUG org.hibernate.jdbc.ConnectionManager - aggressively releasing JDBC connection 2010-04-15 16:07:35,355 [main] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 2010-04-15 16:07:35,355 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling getWarnings... 2010-04-15 16:07:35,355 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: calling clearWarnings... 2010-04-15 16:07:35,484 [main] INFO atomikos - atomikos connection proxy for conn1: url=jdbc:h2:mem:h2TestDB user=H2TESTDB: close()... 2010-04-15 16:07:35,485 [main] INFO atomikos - XAResource.end ( 636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657630303030313030303639:636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657631 , XAResource.TMSUCCESS ) on resource h2jdbc represented by XAResource instance xads0: url=jdbc:h2:mem:h2TestDB;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE user=h2TestDB 2010-04-15 16:07:35,487 [main] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - processing flush-time cascades 2010-04-15 16:07:35,488 [main] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - dirty checking collections 2010-04-15 16:07:35,491 [main] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 0 insertions, 0 updates, 0 deletions to 1 objects 2010-04-15 16:07:35,492 [main] DEBUG org.hibernate.event.def.AbstractFlushingEventListener - Flushed: 0 (re)creations, 0 updates, 0 removals to 0 collections 2010-04-15 16:07:35,493 [main] DEBUG org.hibernate.pretty.Printer - listing entities: 2010-04-15 16:07:35,493 [main] DEBUG org.hibernate.pretty.Printer - de.sf.model.TestEntity{id=1, text=null, value=1} 2010-04-15 16:07:35,493 [main] DEBUG org.hibernate.jdbc.ConnectionManager - aggressively releasing JDBC connection 2010-04-15 16:07:35,494 [main] INFO atomikos - commit() done (by application) of transaction com.atomikos.spring.jdbc.tm-dev0000100069 2010-04-15 16:07:35,498 [Atomikos:3] INFO atomikos - XAResource.prepare ( 636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657630303030313030303639:636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657631 ) returning OK on resource h2jdbc represented by XAResource instance xads0: url=jdbc:h2:mem:h2TestDB;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE user=h2TestDB 2010-04-15 16:07:35,517 [Atomikos:3] INFO atomikos - XAResource.commit ( 636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657630303030313030303639:636F6D2E61746F6D696B6F732E737072696E672E6A6462632E746D2D64657631 , false ) on resource h2jdbc represented by XAResource instance xads0: url=jdbc:h2:mem:h2TestDB;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE user=h2TestDB 2010-04-15 16:07:35,520 [main] INFO atomikos - afterCompletion ( STATUS_COMMITTED ) called on Synchronization: org.compass.gps.device.hibernate.embedded.CompassEventListener$CompassEmbeddedSyncronization@4e26d560 2010-04-15 16:07:35,520 [main] INFO atomikos - afterCompletion ( STATUS_COMMITTED ) called on Synchronization: org.hibernate.ejb.AbstractEntityManagerImpl$1@5782b9b5 2010-04-15 16:07:35,575 [main] INFO atomikos - afterCompletion ( STATUS_COMMITTED ) called on Synchronization: org.compass.core.transaction.JTASyncTransaction$JTATransactionSynchronization@4eff0d4b 2010-04-15 16:07:35,575 [main] INFO atomikos - afterCompletion ( STATUS_COMMITTED ) called on Synchronization: org.hibernate.transaction.CacheSynchronization 2010-04-15 16:07:35,576 [main] DEBUG org.hibernate.ejb.EntityManagerImpl - Closing entity manager after transaction completion 2010-04-15 16:07:35,577 [main] INFO atomikos - afterCompletion ( STATUS_COMMITTED ) called on Synchronization: org.hibernate.ejb.EntityManagerImpl$1@7da2467a Looking at the CMT Factory it has access to the Atomikos JTA objects throught the configured TransactionManager (via TransactionManagerLookup). The Trace above seems ok to me - so actual imho i am using Hibernate + JTA via Atomikos without configuring the JTA Factory for hibernate.
Looking here:
http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/transactions.html 5.2.2 Using JTA [...] It is important to let Hibernate EntityManager define the hibernate.transaction.factory_class (ie not overriding this value). Remember to also set org.hibernate.transaction.manager_lookup_class. [...] So imho in a CMT environment (meaning hibernate does not control the transaction but someone else - e.g. using JTA via Atomikos) the factory must not be overridden anymore. It enough to set the TxManager-Lookup Class to get things running (and it seems to work). |
Powered by FogBugz

