2013-03-25 6 views
0

응용 프로그램을 빌드하기 위해 최대 절전 모드와 봄 모드를 사용하고 있습니다. 필자는 많은 유언장을 가지고 있으므로 일반 DAO,이 DAO를 사용하는 일부 DAO 및 일부 DAO를 확장하는 일부 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); 

} 

}

이 내 지역 DAO와 내가이 나라의 DAO도 HAVA.

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 

} 

} 

이 내 서비스 클래스 :

 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 

} 

    } 

그리고 내 메인 클래스 마침내 :

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); 

응용 프로그램 컨텍스트 파일 :

<?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 for 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 for 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> 

내 메인 클래스를 실행하고 지역을 삽입하면이 지역에 대한 참조가있는 국가 뒤에 두 개의 세션이 만들어지고 여기에서 볼 수있는 것처럼 추가 쿼리가 사용됩니다.

Hibernate: insert into REGIONS (nom_region) values (?) 
Hibernate: select region_.nom_region from REGIONS region_ where region_.nom_region=? 
Hibernate: insert into PAYS (nom_region, nom_pays) values (?, ?) 

로그를 살펴보면 첫 번째 세션이 영역 삽입을 위해 열렸다가 닫히고 두 번째 세션이 국가 삽입을 위해 열리는 것을 보았습니다. 모든 거래에 대해 하나의 세션을 사용하고 싶습니다. 당신이 나를 도울 수 있습니다

+0

[OpenSessionInViewFilter] (https://github.com/SpringSource/spring-framework/blob/3.2.x/spring-orm/src/main/java/org/springframework/orm/hibernate3)에서 살펴볼 수 있습니다. /support/OpenSessionInViewFilter.java) 구현 방법을 확인하십시오. –

+0

위의 예제는 여러 세션에서 동일한 세션을 재사용하려는 경우에만 해당됩니다. 그렇지 않으면 @JBNizet 솔루션으로 이동하십시오 –

답변

1

같은 거래에서 지역과 국가를 동시에 만들 수있는 트랜잭션 서비스를 만들지 않았기 때문에 간단합니다.

대신에 첫 번째 트랜잭션 서비스 호출을 사용하여 영역을 단독으로 만들고 두 번째 트랜잭션 서비스 호출만으로 국가를 만듭니다.

세션이 트랜잭션에 바인딩되어 있으며 좋은 일입니다. 1 시간 전부터 세션이 영원히 지속되고 쓸모없는 데이터로 채워지 길 원치는 않습니다. 그리고 트랜잭션이 병렬로 실행되고 세션이 스레드 안전하지 않기 때문에 모든 트랜잭션에 대해 단일 세션을 가질 필요가 없습니다.

+0

예를 보여줄 수 있습니까? – user1310305

+0

두 가지 기존 서비스 메소드와 동일한 기능을 수행하는 메소드 중 하나에서만 메소드를 작성하십시오. –