은 다음과 실체 B.게으른 부하에 HQL을 통해 일대일 구성은
매핑을 가진 양방향 one-또는 제로 -에 - 하나의 매핑 엔티티 A를하는 경우되는 방법과 같이
<class name="EntityA" table="TABLE_A" mutable="true" lazy="true">
<id name="idA" type="long" column="pk_a" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_a_seq</param>
</generator>
</id>
<one-to-one name="propertyB" class="EntityB" property-ref="propertyA" constrained="true" outer-join="false"/>
</class>
및
<class name="EntityB" table="TABLE_B" mutable="true" lazy="true">
<id name="idB" type="long" column="pk_b" unsaved-value="null">
<generator class="sequence">
<param name="sequence">pk_b_seq</param>
</generator>
</id>
<many-to-one name="propertyA" class="EntityA" not-null="true" unique="true" lazy="proxy" column="fk_a"/>
</class>
내가 EntityA에 대한 (또는 오히려, 명명 된 HQL 질의)는 HQL 질의를 할
, 열심히 최대 절전 모드는 별도의 선택 문 EntityA # propertyB를로드합니다.나의 hql이 1000 EntityA (자신의 각각의 EntityB를 가지고 있음)를 반환하고, 최대 절전 모드가 n + 1 쿼리를 수행하면 문제가 생길 수 있습니다 (n 쿼리가 오는 동안 EntityA가 1000 개의 결과를 반환합니다) EntityA # 속성 B에서 지연로드 선택).
그러나 EntityA # propertyB가 필요하지 않으므로 별도의 SQL 쿼리를 사용하지 않고 최대 절전 모드로 설정하지 않고 게으르며로드하려고합니다.
그럴 수 있습니까? 그리고 만약 그렇다면 어떻게해야합니까?
감사합니다, 프란츠
정확하게 문제를 이해하지 못합니다. 당신이 EntityA의 집합에 대해 hql을 수행한다면, 프록시 메소드 EntityA.getPropertyB()를 호출 할 때마다 상응하는 EntityA # propertyB가 별도의 쿼리를 통해로드 될 것입니다. 이것은 정상적인 지연로드 동작입니다. 그 행동을 정확히하고 싶습니까? –
문제는 query.list()로 n + 1을 얻었 기 때문입니다. 내 조사에서 두 가지 원인이 있습니다 :). session.getNamedQuery ("myQueryString"). .list()를 실행하면 Hibernate는 일치하는 모든 EntityA를 EntityA # getPropertyB 열심히 초기화했다. b.) EntityA # getPropertyB()는 별도의 select 문을 통해 초기화됩니다. 따라서 하나의 query.list()를 사용하면 이미 n + 1 문제가 발생합니다. 내가 (a.) 또는 (b.) 중 하나를 제거 할 수 있다면, 내 n + 1을 풀 수있을 것입니다. preferrably, 나는 (a.)을 제거 할 수 있었다. –