-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 
Author Message
 Post subject: Hibernate + JBoss + Transaction/Session scope
PostPosted: Tue Jun 15, 2004 12:17 pm 
Newbie

Joined: Tue Jun 15, 2004 11:44 am
Posts: 7
It seems that several hibernate sessions are in one way sharing the same Transaction.

Let me explain my problem:

I've 2 different EJBs, the first one (i will call it 'EJBA') is stateful, and call
the second one (i will call it 'EJBB') is stateless.

Here is what I'm doing:

Scenario 1:
1. EJBA is instanciated
2. An hibernate session (A) is associated to EJBA:
InitialContext ic = new InitialContext();
SessionFactory sessionFactory = (SessionFactory) PortableRemoteObject.narrow(ic.lookup(
"java:/HibernateFactory"), SessionFactory.class);
hibernateSession = sessionFactory.openSession();
3. trA= hibernateSession.beginTransaction() is done (on session A)
4. Two queries are done against the session (A) in EJBA, i will call them 'QueryA1' and 'QueryA2'
5. hibernateSession (session A) .isDirty()? returns true
==> OK, i agree
6. A function of EJBB is called by EJBA, inside this function, the EJBB get a session (B) to do some queries:
InitialContext ic = new InitialContext();
SessionFactory sessionFactory = ( SessionFactory ) PortableRemoteObject.narrow( ic.lookup( "java:/HibernateFactory" ), SessionFactory.class );
Session session= sessionFactory.openSession();
7. session (session B) .isDirty? returns false
==> OK, i agree
1st conclusion: session A and session B are two different sessions (it is was I'm expecting)
8. trB= session.beginTransaction() is done (on session B)
9. A query is done against the session (B) in EJBB, i will call it 'QueryB1'
10. trB.commit() is called (I mean i want to commit the QueryB1 made by EJBB inside session B.
11. session B is closed
12. (back to EJBA)
trA.rollback() is issued by EJBA (to rollback QueryA1 and QueryA2.
13. Have a look at the result in database:
Everything is rollbacked! (my step 10 commit is ignored!).


Scenario 2:

Replacing the step 12 by a trA.commit(), then in step 13 everything is commited.

Scenario 3:
Same as scenario 1, but I continue after the trA.rollback().
Since I've rollbacked the 'QueryA1' and 'QueryA2', I want to commit a 'QueryA3'.
14. trA= hibernateSession.beginTransaction() is done (on session A) [again]
I get the exception:
16:42:23,611 ERROR [JTATransaction] Could not register Synchronization
javax.transaction.RollbackException: Already marked for rollback
at org.jboss.tm.TransactionImpl.registerSynchronization(TransactionImpl.java:689)
at net.sf.hibernate.transaction.JTATransaction.begin(JTATransaction.java:169)
at net.sf.hibernate.transaction.JTATransactionFactory.beginTransaction(JTATransactionFactory.java:58)
at net.sf.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:2195)
at com.eft.cbk.kernel.tar.business.TARTasks.createCaseInCBK(TARTasks.java:251)

15. A function of EJBB is called by EJBA, inside this function, the EJBB get a session (B) to do some queries:
InitialContext ic = new InitialContext();
SessionFactory sessionFactory = ( SessionFactory ) PortableRemoteObject.narrow( ic.lookup( "java:/HibernateFactory" ), SessionFactory.class );
Session session= sessionFactory.openSession();
16. session (session B) .isDirty? returns false
==> OK, i agree
1st conclusion: session A and session B are two different sessions (it is was I'm expecting)
17. trB= session.beginTransaction() is done (on session B)
I get the exception:
16:42:23,440 ERROR [JTATransaction] Could not register Synchronization
javax.transaction.RollbackException: Already marked for rollback
at org.jboss.tm.TransactionImpl.registerSynchronization(TransactionImpl.java:689)
at net.sf.hibernate.transaction.JTATransaction.begin(JTATransaction.java:169)
at net.sf.hibernate.transaction.JTATransactionFactory.beginTransaction(JTATransactionFactory.java:58)
at net.sf.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:2195)
at com.eft.cbk.v2x.database.api.entity_seq.Entity_seqTable.getEntitySeq(Entity_seqTable.java:74)



What is wrong?
I have two different beans, with each a different hibernate session that should work with two different transactions.
It seems the sessions differs, but there is a "link" between the both transactions.

Help would be greatly appreciated.

Environment:
JBoss: 3.2.3
Hibernate: 2.1.2
Sun JDK: j2sdk1.4.2_03
OS: Windows 2000
Database: Thin Driver Oracle 8.1.7


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 1 post ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.