LEFT JOIN FETCH
을 사용하여 HQL에서 LAZY
을 무시할 수 있습니다.Hibernate : HQL에서 매핑의 EAGER를 오버라이드 하시겠습니까?
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
EAGER
을 재정의 할 수 있습니까? 방법?
LEFT JOIN FETCH
을 사용하여 HQL에서 LAZY
을 무시할 수 있습니다.Hibernate : HQL에서 매핑의 EAGER를 오버라이드 하시겠습니까?
FROM Obj AS obj LEFT JOIN FETCH obj.otherObj WHERE obj.id = :id
EAGER
을 재정의 할 수 있습니까? 방법?
Hibernate Docs에서이 조각의 규정은 열망과 게으른 무시하지만 수 있음을 의미 다른 방법은 주위에 :
당신이 가져 오는 특성 수준 게으른 를 사용하는 경우 (와 바이트 코드 계측) , fetch all 속성을 사용하여 첫 번째 쿼리에서 속성을 가져 오기 위해 최대 절전 모드로 전환 즉시 적용 할 수 있습니다.
비정상적으로 Criteria API를 사용하면 열망에서 게으름으로 이동할 수 있습니다. 관련 조인에서 setFetchMode(FetchMode.LAZY)
으로 전화하십시오.
역사적인 이유로 몇 가지 일대 다 의존성 사이에서 열심히 가져 오는 상황이있었습니다. 수년에 걸쳐 많은 장소가 그것에 의존하게되었으므로 꺼지기가 어려웠습니다. 그러나 어떤 경우에는 열심히 가져 오는 작업이 방해 받고있었습니다. 테이블에서 더 큰 선택을 할 때마다 각 개체의 컬렉션 각각에 대해 100 개의 작은 하위 쿼리가 생성됩니다. 열망하는 가져 오기를 실제로 덮어 쓰지 않고이 문제를 해결할 수있는 방법을 찾았습니다. 단지 유용하게 사용할 수 있습니다. 한 번에 모든 서브 페치를 수행하는 단일 쿼리를 작성하기 만하면됩니다. 이것은 하이버 네이트가 의존성 그래프를 걷고 100 개의 쿼리를 생성하는 대신 데이터베이스에 1 개의 물리적 쿼리를 만듭니다.
그래서 내가Query q = session.createQuery("from Customer c " +
"left join fetch c.vats v " +
"left join fetch v.klMemos bk " +
"left join fetch bk.ferryKlMemos");
한 고객이 많은 VAT 번호로
Query q = session.createQuery("from Customer c");
교체, 1 VAT 번호 등등 많은 klmemos하고 있습니다. 이전 상황에서는 먼저 고객 만 가져오고 최대 절전 모드에서는 종속 컬렉션 각각을 하나씩 가져 오기 시작합니다. 두 번째 형식은 모든 것을 하나의 네이티브 질의로로드 할 것이고, hibernate는 객체 캐시에 열렬한 콜렉션을 채우기 위해 필요한 모든 것을 찾을 것이다.
이 방법은 또한 모든 "게으른"컬렉션을 열정적 (효율적인) 방식으로 채우는 것처럼 게으르도록 구성된 모음에 대한 빠른 열의 가져 오기를 시뮬레이션합니다.
setFetchMode (FetchMode.LAZY)는 여전히 열심히 그들을 가져 오는 것으로 끝납니다 (즉, 열렬한 조인에 의해 페치되지 않지만 초기 SQL 쿼리 후 n + 1이 선택됩니다). EAGER 설정을 완전히 무시하는 방법은없는 것 같습니다. – jsight
나는 같은 경험을하고있다. 이 주석을위한 JavaDoc은 논란의 여지가 있지만 SELECT 또는 LAZY를 사용하든 자녀들은 여전히 EAGER를 가져온다. 내가 틀린 일을하고 있는지, 아니면 Hibernate 버그가 있는지 확실하지 않다. – atrain
'FetchMode.LAZY'도 사용되지 않습니다 –