testing Hibernate with Spring's EmbeddedDatabaseBuilder issues with SpringSessionContext -


i unit-testing spring framework's embeddeddatabasebuilder datasource , passing hibernate config sessionfactory, using spring 4 , hibernate 4. i not using spring context in way - config use programmatic (no annotations, no xml except hibernate mapping files).

i expected hibernate use default threadlocalsessioncontext , able start , rollback transactions in unit test.

however somehow hibernate has set sessionfactory.currentsessioncontext spring's springsessioncontext , complains whenever try call sessionfactory.getcurrentsession():

hibernateexception: not obtain transaction-synchronized session current thread     @ org.springframework.orm.hibernate4.springsessioncontext.currentsession(springsessioncontext.java:134)     @ org.hibernate.internal.sessionfactoryimpl.getcurrentsession(sessionfactoryimpl.java:1014) 

in code below in unit test, have set hibernate.current_session_context_class thread ignored or replaced spring implementation.

public abstract class hibernatetestbase {      private static embeddeddatabase datasource;     private static sessionfactory sessionfactory;     private session session;      @beforeclass     public static void setupclass() {         datasource = new embeddeddatabasebuilder().                 settype(embeddeddatabasetype.h2).                 addscript("file:sqlresources/schema-1.1.sql").                 addscript("file:sqlresources/schema-1.2.sql").                 build();         configuration configuration = new configuration();         configuration.addresource("hibernate-mappings/hierarchylevel.hbm.xml");         configuration.addresource("hibernate-mappings/hierarchyfilter.hbm.xml");         configuration.addresource("hibernate-mappings/auditlog.hbm.xml");         configuration.setproperty("hibernate.dialect",                 "org.hibernate.dialect.oracle10gdialect");         configuration.setproperty("hibernate.show_sql", "true");         configuration.setproperty("hibernate.current_session_context_class",                 "thread");         standardserviceregistrybuilder serviceregistrybuilder =                 new standardserviceregistrybuilder();         serviceregistrybuilder.applysetting(environment.datasource, datasource);         serviceregistrybuilder.applysettings(configuration.getproperties());         standardserviceregistry serviceregistry =                 serviceregistrybuilder.build();         sessionfactory = configuration.buildsessionfactory(serviceregistry);         sessionfactory.opensession();     }      @afterclass     public static void teardown() {         if (sessionfactory != null) {             sessionfactory.close();         }         if (datasource != null) {             datasource.shutdown();         }     }      @before     public final void starttransaction() {         session = sessionfactory.getcurrentsession();         session.begintransaction();     }      @after     public final void rollback() {         session.flush();         transaction transaction = session.gettransaction();         transaction.rollback();     } } 

i forced call sessionfactory.opensession() instead won't able use daos same sessionfactory because call getcurrentsession(). won't able benefit coded data handling functionality.

what can do?

it works ok when setting configuration object using traditional hibernate.cfg.xml using springsessioncontext production this:

<?xml version="1.0" encoding="utf-8"?> <!doctype hibernate-configuration public   "-//hibernate/hibernate configuration dtd 3.0//en"   "classpath://org/hibernate/hibernate-configuration-3.0.dtd"> <hibernate-configuration>   <session-factory>     <property name="hibernate.dialect">org.hibernate.dialect.oracle10gdialect</property>     <property name="hibernate.show_sql">true</property>     <property name="hibernate.current_session_context_class">org.springframework.orm.hibernate4.springsessioncontext</property>     <!-- property name="hibernate.current_session_context_class">thread</property-->     <mapping resource="hibernate-mappings/accessright.hbm.xml" />   </session-factory> </hibernate-configuration> 

and loading in test, overwriting session context this:

    configuration configuration = new configuration();     configuration.configure(             "hibernate-mappings/hibernate.cfg.xml");     configuration.setproperty("hibernate.current_session_context_class",             "thread"); 

so there going on in background when hibernate sets hibernate.cfg.xml required.


Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - .htaccess mod_rewrite for dynamic url which has domain names -

Website Login Issue developed in magento -