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

Popular posts from this blog

authentication - Mongodb revoke acccess to connect test database -

r - Update two sets of radiobuttons reactively - shiny -

ios - Realm over CoreData should I use NSFetchedResultController or a Dictionary? -