2016-09-08 7 views
0

이 문제는 고전적인 것으로 알고 있지만 어떻게 든이 문제를 해결할 방법을 찾지 못했습니다. 핸들러 방식의 컨트롤러 어딘가에JSP에서 개체의 OneToMany 목록에 액세스 할 때 LazyInitializationException이 발생했습니다.

@OneToMany(cascade=CascadeType.ALL, mappedBy = "a") 
public Set<B> getBList() { 
    return this.bList; 
} 

, 내가

같은 것을 가지고

그래서 나는 두 개의 엔티티, A와 B

다음과 같은 방법이 AI에

사이 OneToMany 관계가

@RequestMapping("/") 
public String method(Model model){ 
    A a = aDAO.findById(1); 
    for(B b : a.getBList()){ 
     System.out.println(b); 
    } 
    model.addAttribute("a",a); 
} 

및 JSP 페이지 내가 가지고있는 다음 EL :

${a.bList} 

핸들러 메서드에서 모든 것이 제대로 작동하고 A 객체가 가진 B 객체 목록이 콘솔에 제대로 표시됩니다.

그러나 JSP 페이지의 렌더링에서의 LazyInitializationException이 나타납니다 :

org.hibernate.LazyInitializationException는 : com.entities.A.bList, 아니 세션 또는 세션 : 게으르게 역할의 컬렉션을 초기화하지 못했습니다 닫혔다

나는 A가 획득 된 세션이 그동안 폐쇄 되었기 때문에이 예외가 보통 나타납니다 (내가 틀렸다면 수정하십시오). 그러나 DAO 클래스의 findById (Long id) 메서드에서 세션을 닫지 않습니다. 그리고 그것이 처리기 메서드에서 인쇄가 작동하는 이유입니다. 그렇다면 왜 EL에 의해 예외가 생겼습니까? 세션이 JSP 페이지의 해석에서 닫히지 않았습니까?

또한 EL에서 목록에 액세스하려면 어떻게해야합니까?

+0

[Solve "롤 지연 컬렉션을 초기화하지 못했습니다."(http://stackoverflow.com/questions/11746499/solve-failed-to-lazily-initialize-a-collection-of-role) -exception) –

+1

DAO findById 메소드에 @Transactional 속성을 추가 했습니까? –

+0

예, @JekinKalariya, 효과가있었습니다. 고맙습니다. 이 주석이 실제로 무엇을 검색 할 것입니다. –

답변

0

언급했듯이 최대 절전 모드 트랜잭션 내에서 메소드를 실행해야하므로 hibernate 세션이 발생하므로 @Transactional Attribute를 DAO 메소드에 작성해야한다.