[jboss-user] [Persistence, JBoss/CMP, Hibernate, Database] - problem with testing: hibernate schema update -> can't commi

gedel do-not-reply at jboss.com
Fri Nov 24 04:47:31 EST 2006


Hello

I write tests for domain persistence layer implemented on Hibernate.
I use JBoss microcontainer for the following purposes:
1. provide Datasources through JNDI
2. provide UserTransaction through JNDI

my tests fork fine. But I want to create database schema on every test run (I use HSQLDB in embedded mode). Schema update is unavailable, because I use LocalTxDataSources which use "test managed" UserTransaction.

stack trace:
SchemaUpdate                   - Running hbm2ddl schema update
  | SchemaUpdate                   - fetching database metadata
  | SchemaUpdate                   - could not get database metadata
  | java.sql.SQLException: You cannot set autocommit during a managed transaction!
  | 	at org.jboss.resource.adapter.jdbc.BaseWrapperManagedConnection.setJdbcAutoCommit(BaseWrapperManagedConnection.java:482)
  | 	at org.jboss.resource.adapter.jdbc.WrappedConnection.setAutoCommit(WrappedConnection.java:322)
  | 	at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:36)
  | 	at org.hibernate.tool.hbm2ddl.SchemaUpdate.execute(SchemaUpdate.java:127)
  | 	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:314)
  | 	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1218)

hibernate.cfg.xml

  | 		<property name="connection.datasource">java:comp/env/jdbc/XxxDataSource</property>
  | 		....
  | <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
  | 		<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup</property>
  | 		<property name="hibernate.transaction.flush_before_completion">true</property>
  | 		<property name="hibernate.transaction.auto_close_session">true</property>
  | 		...
  | <property name="hibernate.hbm2ddl.auto">update</property>

jboss-beans.xml with several datasources:

  |   <bean name="MasterDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource">
  |       <property name="driverClass">org.hsqldb.jdbcDriver</property>
  |       <property name="connectionURL">jdbc:hsqldb:file:test-output/master</property>
  |       <property name="userName">sa</property>
  |       <property name="jndiName">java:comp/env/jdbc/XxxDataSource</property>
  | 
  |   <bean name="SlaveDSBootstrap" class="org.jboss.resource.adapter.jdbc.local.LocalTxDataSource">
  |       <property name="driverClass">org.hsqldb.jdbcDriver</property>
  |       <property name="connectionURL">jdbc:hsqldb:file:test-output/slave</property>
  |       <property name="userName">sa</property>
  |       <property name="jndiName">java:comp/env/jdbc/YyyDataSource</property>
  | 

"problem code" from SchemaUpdate.execute

  | 				log.info("fetching database metadata");
  | 				connection = connectionProvider.getConnection();
  | 				if ( !connection.getAutoCommit() ) { <<<---- i can return true there through extending datasource classes
  | 					connection.commit();
  | 					connection.setAutoCommit(true); <<< --- exception throwing there
  | 					autoCommitWasEnabled = false;
  | 				}
  | 
this code from hibernate 3.0.5, the same (but with insignificant differences) in 3.2

What are you think about this? Which is the simplest way to solve this issue? Should I use nonTx Datasource's ? May be I have to extends LocalTxDataSource and WrappedConnection for return AutoCommit true always?

thanks for your attention

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3988363#3988363

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3988363



More information about the jboss-user mailing list