2013-04-06 4 views
0

org.hibernate.LazyInitializationException는 : 게으르게 역할의 컬렉션을 초기화하지 못했습니다 : 어떤 세션 또는 세션 당신은 아주 작은 세부 사항을 제공어떻게 org.hibernate.LazyInitializationException을 해결할 수 있습니까?

+0

의 중복 가능성 [org.hibernate.LazyInitializationException : 제대로 Hibernate의 지연로드 기능을 사용하는 방법 (http://stackoverflow.com/questions/5837169/org-hibernate-lazyinitializationexception-how-to-properly-use 최대 절전 모드 - 게으른 모드) –

답변

3

폐쇄되지 않았다 com.t4bt.gov.persistence.entities.Experts.institutaionList 당신의 질문 (코드?)이므로 게으른로드에 관한 일반화 된 대답이어야합니다. 앞으로 답을 원할 경우 실제 문제에 대한 구체적인 정보와 해결 방법에 대한 설명을 제공해주십시오.

LazyInitialization은 세션이 닫힌 후에 지연된 속성에 액세스하려고 할 때 발생합니다 (일반적으로 트랜잭션이 끝난 후). lazy 초기화가 작동하는 방식은 객체를 가져올 때 lazily 초기화 된 속성을 가져 오지 않지만 실제로 액세스하려고하면 Hibernate는 데이터베이스에 페치하기 위해 또 다른 쿼리를 수행합니다.

다음은 이러한 오류가 발생합니다 :

여기
public class Something { 
    [...] 
    @OneToMany(fetch = FetchType.LAZY) 
    private List<SomethingElse> somethingElse; 

    public List<SomethingElse> getSomethingElse() { 
     return somethingElse; 
    } 
} 

public class SomethingDao { 
    @Inject 
    private EntityManager em; 

    @Transactional 
    public Something getById(final Integer id) { 
     return em.find(Something.class, id); 
    } 
} 

public class SomethingService { 
    @Inject 
    private SomethingDao dao; 

    public List<SomethingElse> getSomethingElseForSomething(final Integer somethingId) { 
     final Something something = dao.getById(somethingId); 
     return something.getSomethingElse() //Throws LazyInitializationException 
    } 
} 

트랜잭션 (따라서 세션)에만 DAO 클래스에 존재합니다. DAO 방법을 떠나면 세션이 종료됩니다. 따라서 서비스의 lazy-loaded 속성에 접근하려고하면 Hibernate가 세션을 검색하기 위해 세션에 접속하려고 시도 할 때 실패하게된다.

이를 방지하려면 여러 가지 가능성이 있습니다.

  1. 변경 @OneToMany(fetch = FetchType.EAGER) 속성에 뭔가 클래스의 주석이 더 이상로드 - 게으른, 그래서 더 이상 문제가되지 않습니다.
  2. 서비스 방법에 @Transactional을 추가하십시오. 그런 다음 getSomethingElse()에 대한 호출은 Something-object를 가져 오는 것과 동일한 트랜잭션에 있으며 세션은 여전히 ​​유효합니다.
  3. Dao- 메서드에서 getSomethingElse()에 대한 호출을 추가하십시오. 그런 다음 Dao 클래스 (및 트랜잭션)를 떠나기 전에 속성을 초기화 (데이터베이스에서 가져 오기)하고 트랜잭션 외부에서 사용할 수 있습니다. 세션을 검색하기 위해 세션과 통신 할 필요가 없습니다.
관련 문제