최대 절전 모드 게으른 초기화 문제 : LazyInitializationException : 역할 모음을 게으르게 초기화하지 못했습니다.
-
13-09-2019 - |
문제
지속성 계층에서 트랜잭션을 관리하고 싶지만 결과를 게으르게 가져 오려고 할 때이 오류가 발생합니다.
org.hibernate.lazyinitializationException : 역할 모음을 게으르게 초기화하지 못했습니다.
이 문제를 해결하기 위해 Lockmode 또는 다른 방법을 사용할 수 있습니까? 거래없이 ID로 개체를 찾을 수 있습니까?
해결책
문제는 콘텐츠에 액세스하려고 할 때 최대 절전 모드 세션이 이미 닫혔다는 것입니다. 최대 절전 모드는 세션 없이는 내용을로드 할 수 없습니다. 일반적 으로이 문제를 완화하는 두 가지 방법이 있습니다.
페이지가 완료 될 때까지 세션을 닫지 마십시오. 이 패턴을 "세션의 시야"라고하며 예를 들어 서블릿 필터로 구현할 수 있습니다.
세션을 닫기 전에 필요한 모든 내용을 초기화하십시오. 전체 객체를 초기화하려면 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
속성을 사전 가져 오는 방법에는 여러 가지가 있으므로 세션이 닫힌 후에 있습니다.
- 적절한 게터에게 전화하십시오. 필드가 Bean에 가져온 후 세션이 닫힌 후에 있습니다.
- 사용하는 JPA의 Bean Descriptor에서 적절한 속성을 사용하십시오.
@OneToMany(fetch = FetchType.EAGER)
, 그러나 비슷한 최대 절전 모드 방법이 있습니다. - HQL 쿼리에서 필드를 초기화 할 수 있습니다 (HQL에서 작동하는지 확실하지 않지만 그렇습니다).
FETCH INTO
예어.
또는 게으른로드가 작동하는 Ebean Orm과 같이 다른 Orm을 사용하십시오. :)