2014-04-24 3 views
0

데이터베이스에 customers 테이블에 CustomerEntity를 매핑했습니다. 그것은 ordersaddresses에 대해 일대 다 관계를가집니다. 지금은 다음 코드로 주문과 함께 고객을 retreive :Hibernate의 LazyInitializationException을 해결하는 방법

DetachedCriteria criteria = DetachedCriteria.forClass(CustomerEntity.class); 
criteria.add(Restrictions.eq("id", patientId)); 
criteria.createCriteria("orders", CriteriaSpecification.LEFT_JOIN).add(Restrictions.and(
      Restrictions.isNull("deletedDate"), 
      Restrictions.or(Restrictions.isNull("old"), Restrictions.eq("old", BoolType.FALSE)))); 
CustomerEntity customer = queryDao.searchSingle(criteria); 

QueryDAO :

public <T> T searchSingle(DetachedCriteria criteria) { 
    return (T) criteria.getExecutableCriteria(getCurrentSession()).uniqueResult(); 
} 

하지만 슬로우됩니다 customer.getAddresses() 다음 예외를 호출 할 때 :

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: , no session or session was closed 

그것은 기본적으로하기 때문에 발생 Hibernate는 일대 다 엔티티로 로딩되지 않는다. Customer 개체를 수정하지 않고도 어떻게하면 addresses 개체를 검색 할 수 있습니까?

+1

나는 여기에 손가락을 흔들어야한다 : 당신이 "동면하는 lazyinitializationexception"을 봤다면, 왜, 어떻게 해결할 것인가? 기존의 많은 stackoverflow 스레드. – Gimby

답변

1

이 예외는 session을 아직 사용할 수없는 순간에 지연로드 컬렉션 또는 필드에 액세스하려고 할 때 발생합니다. 내 생각 엔 응용 프로그램의 백엔드가 데이터를로드하고 세션을 닫은 다음이 데이터를 프론트 엔드에 전달합니다 (예 : 세션이없는 경우).

  • 열망로드 :

    갈 몇 가지 방법이 있습니다,이 문제를 해결하려면. 신뢰할 만하지만 느린 해결책 일 수도 있습니다.
  • 세션 관리 방식 변경. 일반적인 웹 애플리케이션에 적합한 전략 인 session-per-request을 고려하십시오. 질문 Create Hibernate-Session per Request에 대한 정보가 유용 할 수 있습니다.

는 다른 세션 관리 전략에 대한 자세한 내용은 this wiki page을 읽어보세요.

0

당신에게 도움이 될 수있는 몇 가지가 있습니다

  • customer.getAddresses()를 사용하는 당신은 표시되지 않습니다 Hibernate.initialize(customer.getAddresses())
  • 의 사용 ... 그래서 다른 하나의 방법은 최대 절전 모드를 사용하는 것입니다 보기에서 열린 세션 (이전 답변에서 언급 한 다른 세션 관리 전략과 함께)
관련 문제