java - Spring Hibernate only one session Factory -
i using hibernate , spring build application. have many entites , therefore implement generic dao, dao extends generic dao , services using these dao.
public class genericdaoimpl<t, pk extends serializable> implements igenericdao<t, pk> { private sessionfactory sessionfactory; private class<t> type; public void setsessionfactory(sessionfactory sessionfactory) { this.sessionfactory = sessionfactory; } public session getsession() { return sessionfactory.getcurrentsession(); } public genericdaoimpl(class<t> type) { this.type = type; } public void create(t o) { getsession().save(o); } @suppresswarnings("unchecked") public t read(pk id) { return (t) getsession().get(type, id); } public void update(t o) { getsession().update(o); } }
this region dao , and hava country dao.
public class paysdaoimpl extends genericdaoimpl<pays, string> implements ipaysdao { public paysdaoimpl(class<pays> type) { super(type); } public void deleteregion(pays region) { // todo auto-generated method stub } } this service class :
public class regionserviceimpl implements iregionservice { private iregiondao regiondao; public void setregiondao(iregiondao regiondao) { this.regiondao = regiondao; } public void saveregion(region region) { regiondao.create(region); } public void deleteregion(region region) { // todo auto-generated method stub } } and finaly main class :
applicationcontext appcontext = new classpathxmlapplicationcontext("applicationcontext.xml"); iregionservice regionbo=(iregionservice)appcontext.getbean("myregionservice"); ipaysservice paysbo=(ipaysservice)appcontext.getbean("mypaysservice"); region r=new region(); r.setnom("europe"); pays p=new pays(); p.setnom("belgique"); p.setnomregion(r); r.getlespays().add(p); regionbo.saveregion(r); paysbo.savepays(p); application context file:
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="baselinedatasource" class="org.springframework.jdbc.datasource.drivermanagerdatasource"> <property name="driverclassname" value="com.mysql.jdbc.driver" /> <property name="url" value="jdbc:mysql://localhost/baseline" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="baselinesessionfactory" class="org.springframework.orm.hibernate4.localsessionfactorybean"> <property name="datasource" ref="baselinedatasource" /> <property name="annotatedclasses"> <list> <value>domain.entites.region </value> <value>domain.entites.pays </value> </list> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.mysqldialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.hbm2ddl.auto">create</prop> <prop key="current_session_context_class">thread</prop> </props> </property> </bean> <!-- hibernate transaction manager definition --> <bean id="transactionmanager" class="org.springframework.orm.hibernate4.hibernatetransactionmanager"> <property name="sessionfactory" ref="baselinesessionfactory" /> </bean> <!-- ========================= start of dao definitions ========================= --> <!-- proxy dao using generic dao --> <bean id="mygenericdao" abstract="true"> <property name="sessionfactory" ref="baselinesessionfactory" /> </bean> <!-- region dao definition --> <bean id="myregiondao" class="dao.impl.regiondaoimpl" parent="mygenericdao"> <constructor-arg value="domain.entites.region" /> </bean> <!-- region dao definition --> <bean id="mypaysdao" class="dao.impl.paysdaoimpl" parent="mygenericdao"> <constructor-arg value="domain.entites.pays" /> </bean> <!-- ========================= start of service definitions ========================= --> <!-- transactional proxy services --> <bean id="proxyservice" class="org.springframework.transaction.interceptor.transactioninterceptor"> <property name="transactionmanager" ref="transactionmanager" /> <property name="transactionattributes"> <props> <prop key="find*">propagation_required, readonly</prop> <prop key="get*">propagation_required, readonly</prop> <prop key="*">propagation_required, -java.lang.exception</prop> </props> </property> </bean> <!-- autoproxy --> <bean id="transactionbeannameproxycreator" class="org.springframework.aop.framework.autoproxy.beannameautoproxycreator"> <property name="beannames"> <value>*service</value> </property> <property name="interceptornames"> <list> <value>proxyservice</value> </list> </property> </bean> <bean id="myregionservice" class="domain.services.impl.regionserviceimpl"> <property name="regiondao" ref="myregiondao" /> </bean> <bean id="mypaysservice" class="domain.services.impl.paysserviceimpl"> <property name="paysdao" ref="mypaysdao" /> </bean> my problem when run main class, , insert region, after country has reference region, 2 sessions created , query used can see here :
hibernate: insert regions (nom_region) values (?) hibernate: select region_.nom_region regions region_ region_.nom_region=? hibernate: insert pays (nom_region, nom_pays) values (?, ?) and when in log, saw first session opened inserting region, closed , second session opened inserting country. use 1 session transaction. may can me
that's because haven't created transactional service create region , country @ same time, in same transaction.
instead, you'e using first transactional service call create region alone, , second 1 create country alone.
the session bound transaction, , it's thing. don't want session last forever , filled obsolete data 1 hour ago. , less went have single session transactions, since transactions excute in parallel, , session not threadsafe.
Comments
Post a Comment