2010-06-18 2 views

답변

3

Hibernate Docs에서이 조각의 규정은 열망과 게으른 무시하지만 수 있음을 의미 다른 방법은 주위에 :

당신이 가져 오는 특성 수준 게으른 를 사용하는 경우 (와 바이트 코드 계측) , fetch all 속성을 사용하여 첫 번째 쿼리에서 속성을 가져 오기 위해 최대 절전 모드로 전환 즉시 적용 할 수 있습니다.

비정상적으로 Criteria API를 사용하면 열망에서 게으름으로 이동할 수 있습니다. 관련 조인에서 setFetchMode(FetchMode.LAZY)으로 전화하십시오.

+1

setFetchMode (FetchMode.LAZY)는 여전히 열심히 그들을 가져 오는 것으로 끝납니다 (즉, 열렬한 조인에 의해 페치되지 않지만 초기 SQL 쿼리 후 n + 1이 선택됩니다). EAGER 설정을 완전히 무시하는 방법은없는 것 같습니다. – jsight

+0

나는 같은 경험을하고있다. 이 주석을위한 JavaDoc은 논란의 여지가 있지만 SELECT 또는 LAZY를 사용하든 자녀들은 여전히 ​​EAGER를 가져온다. 내가 틀린 일을하고 있는지, 아니면 Hibernate 버그가 있는지 확실하지 않다. – atrain

+0

'FetchMode.LAZY'도 사용되지 않습니다 –

4

역사적인 이유로 몇 가지 일대 다 의존성 사이에서 열심히 가져 오는 상황이있었습니다. 수년에 걸쳐 많은 장소가 그것에 의존하게되었으므로 꺼지기가 어려웠습니다. 그러나 어떤 경우에는 열심히 가져 오는 작업이 방해 받고있었습니다. 테이블에서 더 큰 선택을 할 때마다 각 개체의 컬렉션 각각에 대해 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는 객체 캐시에 열렬한 콜렉션을 채우기 위해 필요한 모든 것을 찾을 것이다.

이 방법은 또한 모든 "게으른"컬렉션을 열정적 (효율적인) 방식으로 채우는 것처럼 게으르도록 구성된 모음에 대한 빠른 열의 가져 오기를 시뮬레이션합니다.

관련 문제