2012-03-16 5 views
0

과 :최대 절전 모드 - N + 1 개 선택 쿼리기구가 1 대 1로 주소에 매핑되는 1 대 1

기구 :

<one-to-one class="Address" constrained="true" name="address" property-ref="organizationId"/> 

주소 :

<many-to-one class="Organization" name="organization"> 
      <column name="OrganizationID" not-null="false" unique="true"/> 
    </many-to-one> 

이 쿼리는 모든 조직 +1에 대해 추가 선택을 생성합니다 :

query = session.createQuery("select o from Organization as o where o.isCool=0").setReadOnly(true); 
    organizations = query.list(); 

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.htmlfetch="join"에게 알려주지 만 이는 별 차이가 없습니다. 이 문제를 해결하는 방법? 어떤 도움을 주셔서 감사합니다.

EDIT 디버거에서 실제로 그 주소가 게으르지 않은 것을 볼 수 있습니다. 이유는 모르겠습니다.

답변

1

당신이 물건을 가져 오기 위해 HQL을 사용하고 있기 때문에, n + 1 문제를 피하기 위해 단순히 주석이나 애트리뷰트를 사용하는 것은 도움이되지 않습니다.

올바른 해결책은 쿼리에서 'FETCH JOIN'절을 사용하는 것입니다. 자세한 내용은 다음 링크를 참조하십시오. http://www.realsolve.co.uk/site/tech/hib-tip-pitfall.php?name=n1selects

+0

응답 해 주셔서 감사합니다. 그러나이 모든 가져온 데이터를 메모리에 보관하고 사용하지 않는 것이 효율적입니까? 나는 hql을 사용하지 않는다. 그래서 기준을 사용해야합니까? – emmma1223

+0

HQL을 계속 사용할 수 있습니다. 사실 FETCH JOIN 절을 사용하면 필요한 물건 (조건 o.isCool = 0이 true 인 레코드) 만 n + 1 페치를 수행하지 않고도 여전히 가져올 수 있습니다. – PaiS

+0

나와 함께 곰, 나는 이해가 가지 않는다. 페치 조인이 주소를 초기화하지 않는다고 말하는 겁니까? – emmma1223