최대 절전 모드 게으른 초기화 문제 : LazyInitializationException : 역할 모음을 게으르게 초기화하지 못했습니다.

StackOverflow https://stackoverflow.com/questions/781751

문제

지속성 계층에서 트랜잭션을 관리하고 싶지만 결과를 게으르게 가져 오려고 할 때이 오류가 발생합니다.

org.hibernate.lazyinitializationException : 역할 모음을 게으르게 초기화하지 못했습니다.

이 문제를 해결하기 위해 Lockmode 또는 다른 방법을 사용할 수 있습니까? 거래없이 ID로 개체를 찾을 수 있습니까?

도움이 되었습니까?

해결책

문제는 콘텐츠에 액세스하려고 할 때 최대 절전 모드 세션이 이미 닫혔다는 것입니다. 최대 절전 모드는 세션 없이는 내용을로드 할 수 없습니다. 일반적 으로이 문제를 완화하는 두 가지 방법이 있습니다.

  1. 페이지가 완료 될 때까지 세션을 닫지 마십시오. 이 패턴을 "세션의 시야"라고하며 예를 들어 서블릿 필터로 구현할 수 있습니다.

  2. 세션을 닫기 전에 필요한 모든 내용을 초기화하십시오. 전체 객체를 초기화하려면 Hibernate.initialize (Object)를 사용할 수 있습니다.

편집 : 최대 절전 모드에서 거래를 벗어난 것을 할 수 없습니다.

다른 팁

Hibernate의 공식 솔루션을 볼 수도 있습니다.http://www.hibernate.org/43.html

일반적으로 문제는 물체의 속성 중 하나가 게으르게로드된다는 것입니다. 당신이 할 수있는 한 가지는 쿼리에 미리로드하는 것입니다.

Sale Sale.Date> : StartDate Left Eni Fetch Sale.Product

이것은 Sale.Product Object를 미리 가져옵니다.

이 사이트에는 더 많은 정보가 있습니다. http://www.javalobby.org/articles/hibernate-query-101/.

-Dave

속성을 사전 가져 오는 방법에는 여러 가지가 있으므로 세션이 닫힌 후에 있습니다.

  1. 적절한 게터에게 전화하십시오. 필드가 Bean에 가져온 후 세션이 닫힌 후에 있습니다.
  2. 사용하는 JPA의 Bean Descriptor에서 적절한 속성을 사용하십시오. @OneToMany(fetch = FetchType.EAGER), 그러나 비슷한 최대 절전 모드 방법이 있습니다.
  3. HQL 쿼리에서 필드를 초기화 할 수 있습니다 (HQL에서 작동하는지 확실하지 않지만 그렇습니다). FETCH INTO 예어.

또는 게으른로드가 작동하는 Ebean Orm과 같이 다른 Orm을 사용하십시오. :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top