java - Hibernate+Spring SessionFactory configuration -
what right way configure sessionfactory?
if way:
<tx:annotation-driven transaction-manager="transactionmanager" /> <bean id="sessionfactory" class="org.springframework.orm.hibernate5.localsessionfactorybean" p:datasource-ref="datasource" p:packagestoscan="ua.com.javer.flowerexpert"/> <bean id="transactionmanager" class="org.springframework.orm.hibernate5.hibernatetransactionmanager" p:sessionfactory-ref="sessionfactory" />
i error:
nested exception org.hibernate.hibernateexception: not obtain transaction-synchronized session current thread
and if change annotationsessionfactorybean
:
<bean id="sessionfactory" class="org.springframework.orm.hibernate3.annotation.annotationsessionfactorybean" p:datasource-ref="datasource" p:packagestoscan="ua.com.javer.flowerexpert"/>
i get:
nested exception java.lang.noclassdeffounderror: [lorg/hibernate/engine/filterdefinition;
even though in older project hibernate3.annotation.annotationsessionfactorybean
works fine.
my pom.xml
contains:
<dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-core</artifactid> <version>5.0.1.final</version> <exclusions> <exclusion> <groupid>org.hibernate.javax.persistence</groupid> <artifactid>hibernate-jpa-2.1-api</artifactid> </exclusion> </exclusions> </dependency> <dependency> <groupid>org.hibernate</groupid> <artifactid>hibernate-entitymanager</artifactid> <version>5.0.1.final</version> </dependency> <dependency> <groupid>c3p0</groupid> <artifactid>c3p0</artifactid> <version>0.9.1.2</version> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-orm</artifactid> <version>${spring.version}</version> </dependency>
here's service class:
@service("colorsservice") @transactional public class colorsservice { @autowired private colordao colordao; public list<color> getallcolors() { return colordao.getallcolors(); } }
and here's dao:
@component @repository("colordao") public class colordaohibernate implements colordao { @autowired private sessionfactory sessionfactory; public colordaohibernate() { } @override public list<color> getallcolors() { session session = sessionfactory.getcurrentsession(); // statelesssession session = sessionfactory.openstatelesssession(); query query = session.createquery("from color"); return query.list(); } }
notice:
if use sessionfactory.openstatelesssession();
in dao class hibernate5.localsessionfactorybean
in session configuration not cause problem.
but point - want use sessionfactory.getcurrentsession();
how can achieve this?
hope enabled transaction support in spring configuration file. if not, enable using <tx:annotation-driven>
and also, declare transactionmanager
follows:
<bean id="transactionmanager" class="org.springframework.jdbc.datasource.datasourcetransactionmanager"> <property name="datasource" ref="datasource"/> </bean>
try removing @transactional
colorsservice
below:
@service("colorsservice") public class colorsservice { @autowired private colordao colordao; public list<color> getallcolors() { return colordao.getallcolors(); } }
and adding colordaohibernate
:
@repository("colordao") public class colordaohibernate implements colordao { @autowired private sessionfactory sessionfactory; public colordaohibernate() { } @transactional @override public list<color> getallcolors() { session session = sessionfactory.getcurrentsession(); // statelesssession session = sessionfactory.openstatelesssession(); query query = session.createquery("from color"); return query.list(); } }
edit sessionfactory
bean definition below:
<bean id="hibernateprops" class="org.springframework.beans.factory.config.propertiesfactorybean"> <property name="properties"> <props> <prop key="hibernate.current_session_context_class">thread</prop> </props> </property> </bean> <bean id="sessionfactory" class="org.springframework.orm.hibernate5.localsessionfactorybean" p:datasource-ref="datasource" p:packagestoscan="ua.com.javer.flowerexpert" p:hibernateproperties-ref="hibernateprops" />
Comments
Post a Comment