Atomikos Forum |
|
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 default82df.html?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). |