2012-03-01 2 views
2

Spring 3.0.5, Hibernate 3.6.7 및 Vaadin을 사용하고 있습니다. 트랜잭션 방식으로 바인드 된 세션에서도 Hibernate "no session or session was closed"

나는 내가 컨텍스트에서 얻을 대화의 창을 가지고이

@Entity 
public class Foo { 
    @OneToMany(fetch = FetchType.LAZY) 
    private Collection<Bar> bars; 
    ... 
} 

처럼 간단한 개체를하고 '갑'에서 '바'를 보여줄 예정. 사용자가 foo는 막대를 보여달라고 할 때

@Component 
@Scope("prototype") 
public class FooBarDialogImp extends Window implements FooBarDialog { 
    @Transactional(readOnly = true) 
    public void populate(Foo foo) { 
     ... 
     for (Bar bar : foo.getBars()) { 
      // populate the dialog with bar information 
      ... 
     } 
    } 
} 

는, 나는이

public class FooController { 
... 
    public void showFooBars(Foo foo) { 
     FooBarDialog dialog = context.getBean(FooBarDialog.class); 

     dialog.populate(foo); 
     showDialog(dialog); 
    } 
} 

그런 짓을하지만 문제는 최대 절전 모드에서 "아니오 세션"예외를 얻을 수 있다는 것입니다. 세션 팩토리를 삽입하고 바운드 세션이 있는지 확인하기 위해 코드를 변경했습니다. 내가 뭘 잘못하고 있는지 모르겠다. 누구나 아이디어가 있으십니까?

답변

8

컬렉션의 연관 유형을 LAZY로 지정 했으므로 소유 객체의 getter 메소드가 호출 될 때까지로드되지 않습니다. 이 작업을 수행 할 때주의해야 할 점은 세션을 생성 한 원래 세션이나 새 세션의 범위에 있어야한다는 것입니다. 그리고 새 세션을 사용하여 게으른 목록을로드하는 것에 대한주의 사항은 엔티티가 세션에서 분리 된 것으로 간주되므로 먼저 게으름 수집을 위해 호출하기 전에 merged이어야합니다.

그래서 그냥 전화 :

session.merge(foo); 

bars를 반복하기 전에.

+0

굉장합니다. 나는 세션에서 분리되는 엔티티에 대해 생각하지 않았다. 당신의 대답은 더 나은 해결책을 찾기 위해 빛을주었습니다. 감사 :) –