2012-07-04 3 views
0

나는 Hiberante 및 Spring에 문제가 있습니다.최대 절전 모드 및 스프링 세션 구성

엔티티를 모두 구할 때 하위 프로퍼티를 사용하면 세션이 닫히기 때문에 게으른로드가 실패합니다 ... 왜 일찍 세션을 닫을 수 있습니까? 서비스를 종료하거나 스레드 당 하나의 세션을 가져갈 때까지 기다릴 수 없습니까?

이 내 DAO이다

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.cinebot.db.entity</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

내 구성입니다 :

@Transactional 
public class Dao { 


    @Autowired 
    private SessionFactory sessionFactory; 

    public Session getSession(){ 
     return sessionFactory.getCurrentSession(); 
    } 

    @SuppressWarnings("unchecked") 
    public <T> T get(Class<T> classe, Serializable id) throws Exception { 
     if(id==null) return null; 
     T obj = (T) getSession().get(classe, id); 
     return obj; 
    } 

}

와 나는 오류를 얻을 곳이있는 내부 (getEventi()는로드 게으른) @ 서비스 클래스 :

Spettacoli spettacolo = dao.get(Spettacoli.class, spettacoloId); 
    if(spettacolo.getEventi().getScadenza()>0) throw new LogicalException("Spettacolo scaduto"); 
+0

엔티티 속성에 액세스하는 위치는 어디입니까? –

+0

은 getSession()으로 해당 엔티티를 가져온 직후에 @Service 클래스에 있습니다. get() – Tobia

+0

DAO 메소드를 포함하여 여기에 서비스 메소드 코드를 표시 할 수 있습니까? 거래 내역 –

답변

1

트랜잭션 외부의 엔티티에 액세스하고 있습니다. 서비스 메소드를 트랜잭션으로 표시해야합니다.

dao 메소드가 완료되면 트랜잭션이 종료되므로 서비스 메소드에서 해당 엔티티에 액세스 할 때 분리 된 엔티티가되므로 예외가 발생합니다.

DAO가 아니라 서비스에서 트랜잭션을 시작해야합니다. 그러면 DAO가 아닌 하위 엔티티에 액세스 할 수 있습니다. @transactional 주석을 서비스 메소드로 옮기십시오.

+0

감사합니다. Sunil,하지만 좀 더 질문이 있습니다. 컨트롤러에 게으른 속성이 필요한 경우 (예를 들어) 트랜잭션을 추가해야합니까? – Tobia

+0

아니요. 거기에 전송 객체를 사용해야합니다. 디자인 컨벤션에서 엔티티를 컨트롤러로 옮기지 말고 전송 객체를 사용하여 엔티티 정보를 전달하십시오. 전송 객체 (TO)는 엔티티의 필수 필드를 포함하는 Java bean입니다. 이 TO는 서비스 메서드 –

+0

에 채워집니다. Ok, 고맙습니다! – Tobia

관련 문제