I have the following code to test whether a JTA Transaction really can rollback:
Code:
Customer ctmr = new Customer("John", "Doe");
ctmr.setcid(1); //Set customer ID
Fintrans fts = new Fintrans();
fts.setAmountWillingToPay(12000.05);
fts.setCustomer(ctmr);
fts.setDatetime("06/22/2006");
fts.setGrandTotalAccrued(3213.20);
fts.setGrandTotalPaid(13651.10);
fts.setReason("No reason given");
Transaction tx = null;
try{
tx = factory.openSession().beginTransaction();
Session session = factory.getCurrentSession();
session.save(fts);
tx.commit();
}catch(Exception e){
if (tx!=null)
tx.rollback();
throw e;
}
I have two tables on the same database - customer and fintrans. The fintrans table has a foreign key to the customer table (cid). The customer table is empty, so when I run the above code it should rollback because cid of value 1 which I am entering into the fintrans table does not exist in the customer table. However, this is not the case. Instead I am getting the following exception and the entry is still being made in the fintrans table:Code:
org.hibernate.TransactionException: JTA commit failed:
org.hibernate.transaction.JTATransaction.commit(JTATransaction.java:153)
springapp2.controllers.OutputController.handleRequest(OutputController.java:136)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:44)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:717)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:658)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:392)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:347)
javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:73)
com.sun.enterprise.web.VirtualServerPipeline.invoke(VirtualServerPipeline.java:120)
org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:231)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.invokeAdapter(ProcessorTask.java:667)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.processNonBlocked(ProcessorTask.java:574)
com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:844)
com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:287)
com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:212)
com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:252)
com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:75)
I dont think there is any problems with my configuration file:Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">zzzzzzz</property>
<property name="connection.username">zzzzzz</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="dialect">org.hibernate.dialect.MySQLMyISAMDialect</property>
<property name="connection.password">zzzzz</property>
<property name="connection.pool_size">10</property>
<property name="transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="current_session_context_class">org.hibernate.context.JTASessionContext</property>
<property name="transaction.manager_lookup_class">org.hibernate.transaction.SunONETransactionManagerLookup</property>
<property name="jta.UserTransaction">java:comp/UserTransaction</property>
<!-- this will show us all sql statements -->
<property name="hibernate.show_sql">true</property>
<!-- this will create the database tables for us -->
<property name="hibernate.hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
Is this what is supposed to happen? I thought rollback should not allow the entry to be made into the database table.
Any help in the matter would be greatly appreciated.
Outlaw.