Hi all, having a little problem that I'm hoping someone can shed some light on.
I have a servlet in which I'm trying to use JTA transactions, but when I call
the commit() method on the UserTransaction, I get back:
2006-01-03 21:08:25,718 INFO [STDOUT] org.jboss.tm.JBossRollbackException:
Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257,
GlobalId=pathfinder/16, BranchQual=, localId=16] status=STATUS_NO_TRANSACTION
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:344)
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.TxManager.commit(TxManager.java:200)
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:126)
2006-01-03 21:08:25,718 INFO [STDOUT] at
test.TransactServlet.doGet(TransactServlet.java:52)
I added some debugging statements to check though, and there is an active
transaction right at the moment when commit() is called. This we can see from
a slightly larger snippet of the trace file:
2006-01-03 21:08:25,687 INFO [test.TransactServlet] Before commit: 0 -
STATUS_ACTIVE
2006-01-03 21:08:25,687 DEBUG [org.hibernate.transaction.CacheSynchronization]
transaction before completion callback
2006-01-03 21:08:25,687 DEBUG [org.hibernate.transaction.CacheSynchronization]
automatically flushing session
2006-01-03 21:08:25,687 DEBUG [org.hibernate.impl.SessionImpl] automatically
flushing session
2006-01-03 21:08:25,687 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] flushing session
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] processing flush-time
cascades
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] dirty checking
collections
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] Flushing entities and
processing referenced collections
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] Processing unreferenced
collections
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] Scheduling collection
removes/(re)creates/updates
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0 insertions,
0 updates, 0 deletions to 1 objects
2006-01-03 21:08:25,703 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] Flushed: 0
(re)creations, 0 updates, 0 removals to 0 collections
2006-01-03 21:08:25,718 DEBUG [org.hibernate.pretty.Printer] listing entities:
2006-01-03 21:08:25,718 DEBUG [org.hibernate.pretty.Printer]
test.UserObject{name=JBossHibernate, id=77}
2006-01-03 21:08:25,718 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] executing flush
2006-01-03 21:08:25,718 DEBUG
[org.hibernate.event.def.AbstractFlushingEventListener] post flush
2006-01-03 21:08:25,718 DEBUG [org.hibernate.jdbc.JDBCContext] before
transaction completion
2006-01-03 21:08:25,718 DEBUG [org.hibernate.impl.SessionImpl] before
transaction completion
2006-01-03 21:08:25,718 DEBUG [org.hibernate.transaction.CacheSynchronization]
transaction after completion callback, status: 4
2006-01-03 21:08:25,718 DEBUG [org.hibernate.jdbc.JDBCContext] after
transaction completion
2006-01-03 21:08:25,718 DEBUG [org.hibernate.impl.SessionImpl] after
transaction completion
2006-01-03 21:08:25,718 DEBUG [org.hibernate.jdbc.JDBCContext] no active
transaction, could not register Synchronization
2006-01-03 21:08:25,718 DEBUG [org.hibernate.jdbc.JDBCContext] no active
transaction, could not register Synchronization
2006-01-03 21:08:25,718 DEBUG [org.hibernate.transaction.CacheSynchronization]
automatically closing session
2006-01-03 21:08:25,718 DEBUG [org.hibernate.impl.SessionImpl] automatically
closing session
2006-01-03 21:08:25,718 DEBUG [org.hibernate.impl.SessionImpl] closing session
2006-01-03 21:08:25,718 DEBUG [org.hibernate.jdbc.ConnectionManager] connection
already null in cleanup : no action
2006-01-03 21:08:25,718 INFO [STDOUT] org.jboss.tm.JBossRollbackException:
Unable to commit, tx=TransactionImpl:XidImpl[FormatId=257,
GlobalId=pathfinder/16, BranchQual=, localId=16] status=STATUS_NO_TRANSACTION
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.TransactionImpl.commit(TransactionImpl.java:344)
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.TxManager.commit(TxManager.java:200)
2006-01-03 21:08:25,718 INFO [STDOUT] at
org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:126)
2006-01-03 21:08:25,718 INFO [STDOUT] at
test.TransactServlet.doGet(TransactServlet.java:52)
Here is the code for the servlet in question:
| @Override
| protected void doGet( HttpServletRequest request, HttpServletResponse
response ) throws ServletException, IOException
| {
| try
| {
| /* get JNDI Context */
| InitialContext jndiCtx = new InitialContext();
|
| SessionFactory sf =
| new Configuration().configure().buildSessionFactory();
|
| // get the UserTransactionObject
| UserTransaction ut = (UserTransaction)jndiCtx.lookup(
"UserTransaction" );
|
| ut.begin();
| logger.info( "UT status right after begin: " +
getStatusName( ut.getStatus() ) );
|
| // and open the Hibernate session
| Session session = sf.getCurrentSession();
|
| // do something transactional using Hibernate
| UserObject obj = new UserObject( "JBossHibernate" );
| session.save( obj );
|
| // do something else involving the transaction (send a
JMS message, for example)
| // TODO: add a separate transactional step here
|
| logger.info( "Before commit: " + getStatusName(
ut.getStatus() ) );
|
|
|
| // commit the transaction
| /* this is where it blows up!! */
| ut.commit();
|
| logger.info( "After commit: " + getStatusName(
ut.getStatus() ) );
|
| PrintWriter out = response.getWriter();
| out.append(
"<html><head><title>Success</title></head><body><p />Success!</body>");
| }
| catch( Exception e )
| {
| e.printStackTrace();
|
| PrintWriter out = response.getWriter();
|
| StringWriter sw = new StringWriter();
| PrintWriter pw = new PrintWriter(sw, true);
| pw.append( "<html><head><title>Error</title></head><body><p />"
);
| e.printStackTrace(pw);
| pw.append( "</body>");
|
| pw.flush();
| sw.flush();
|
| out.print( sw.toString() );
| }
|
If it helps, here are the datasource definition and the hibernate.cfg.xml:
datasource
| <?xml version="1.0" encoding="UTF-8"?>
|
| <!-- =====================================================================
-->
| <!-- -->
| <!-- JBoss Server Configuration -->
| <!-- Thanks to Horia Muntean <[EMAIL PROTECTED]> -->
| <!-- =====================================================================
-->
|
| <!-- $Id: db2-xa-ds.xml,v 1.4 2004/09/15 14:37:40 loubyansky Exp $ -->
|
|
| <datasources>
| <!--
| XADatasource for DB2 V8.1 (app driver)
| copy $db2_install_dir/java/db2java.zip into
$jboss_install_dir/server/default/lib
| -->
|
| <xa-datasource>
| <jndi-name>db2DataSource</jndi-name>
|
|
<xa-datasource-class>COM.ibm.db2.jdbc.DB2XADataSource</xa-datasource-class>
| <xa-datasource-property
name="DatabaseName">HIBTEST</xa-datasource-property>
| <xa-datasource-property name="User">prhodes</xa-datasource-property>
| <xa-datasource-property
name="Password">redacted</xa-datasource-property>
|
| <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml
(optional) -->
| <metadata>
| <type-mapping>DB2</type-mapping>
| </metadata>
| </xa-datasource>
|
| </datasources>
|
|
hibernate config
| <hibernate-configuration>
| <session-factory>
| <property name="connection.autocommit">false</property>
| <property
name="connection.datasource">java:/db2DataSource</property>
| <property
name="dialect">org.hibernate.dialect.DB2Dialect</property>
| <property
name="transaction.flush_before_completion">true</property>
| <property name="transaction.auto_close_session">true</property>
| <property
name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
| <property
name="transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
| <property name="current_session_context_class">jta</property>
|
| <mapping resource="test/UserObject.hbm.xml" />
|
| </session-factory>
|
| </hibernate-configuration>
|
|
UserObject is just a stupid little class with an id and one attribute:
| <hibernate-mapping>
| <class name="test.UserObject" table="USEROBJECT">
| <id name="id" column="ID" type="long">
| <generator class="native" />
| </id>
| <property name="name" column="NAME" type="string" />
| </class>
| </hibernate-mapping>
|
| package test;
|
| public class UserObject
| {
| private Long id;
| private String name;
|
| public UserObject()
| {
| }
|
| public UserObject( String name )
| {
| this.name = name;
| }
|
| public Long getId()
| {
| return id;
| }
|
| public void setId( Long id )
| {
| if( this.id == null )
| {
| this.id = id;
| }
| else
| {
| throw new RuntimeException( "attempt to modify
immutable field \"id\" with value: " + this.id );
| }
| }
|
| public void setName( String name )
| {
| this.name = name;
| }
|
| public String getName()
| {
| return name;
| }
| }
|
View the original post :
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3915414#3915414
Reply to the post :
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3915414
-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
JBoss-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jboss-user