문제

엔티티 B와의 양방향 1 개 또는 제로에서 하나의 매핑이있는 엔티티 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 쿼리)를 수행 할 때 Hibernate는 Entitya#PropertyB를 별도의 선택 문으로 간절히로드합니다.

내 문제는 내 HQL이 1000 Entitya (모두 각각의 EntityB를 가지고 있음)를 반환하는 경우, 최대 절전 모드는 N+1 쿼리를 수행합니다 (첫 번째 쿼리는 Entitya가 1000 결과를 반환하는 반면 N Queries는 Entitya#에서 나옵니다. Propertyb Lazy Loading을 선택합니다).

그러나 Entitya#PropertyB가 필요하지 않기 때문에 대신에 게으른로드를 원하는 이유입니다 (최대 절전 모드가 별도의 SQL 쿼리를 사용하지 않고).

그게 가능합니까? 그렇다면 어떻게해야합니까?

감사합니다, 프란츠

도움이 되었습니까?

해결책

이 문제를 해결했습니다.

내가 한 일은 Field Entitya#PropertyB를 Entitya#PropertyBS 이름으로 세트로 만들어주는 것이 었습니다. 그러나 Entitya#getPropertyb () 및 Entitya#setPropertyb (EntityB PropertyB) 액세서 방법을 유지했습니다.

이러한 액세서 방법의 방법 본문은 이제 다음과 같습니다.

public EntityB getPropertyB() {
    return CollectionUtils.get(propertyBs, 0);
}

public void setPropertyBs(EntityB propertyB) {
    propertyBs= Collections.singleton(propertyB);
}

그런 다음 매핑에서 Set Entitya#PropertyBS를 매핑하고 '필드'에 대한 액세스를 지정합니다.

<set name="scheduledAdInfos" lazy="true" fetch="subselect" access="field" cascade="none" inverse="true">
    <key column="pk_a"/>
    <one-to-many class="EntityB"/>
</set>

이 설정을 사용하면 Table_A가 Table_B가 소유 한 경우에도 소유 Pojo (Entitya)에서 소유 Pojo (EntityB)로 게으른 매핑을 만들 수 있습니다.

다른 팁

짧은 답변 : 아니요, 적어도 데이터베이스와 매핑을 변경하지 않고는 할 수 없습니다. 기본적으로 원하는 방식으로 일하기 위해 일대일 매핑과 외국 키 관계를 뒤집어 야합니다.


더 긴 답변 : 최대 절전 모드는 게으른 부하 연관성을 만들 수 있습니다. 이를 수행하는 방식은 참조 된 객체의 ID를 보유하는 프록시 객체를 주입하는 것입니다.

귀하의 경우, 맵핑은 외국 키 열이 Table_B, 즉 다중 매핑을 사용하는 곳입니다. 따라서 A B를로드하면 최대 절전 모드는 FK_A 열에서 FK 참조를 찾아이 값을 보유하는 프록시를 만들 수 있습니다. 프록시가 액세스되면 해당 엔티티가로드됩니다.

표 A의 레코드가 선택되면 어떻게됩니까? Hibenate는 A 객체를 만들지 만 PropertyB를 채울 수 있으려면 table_B를 살펴보고 FK_A = A.ID를 가진 해당 행을 찾아야합니다. 최대 절전 모드가 게으른 로딩 시간에 어떤 레코드를로드할지 알아내는 다른 방법은 없습니다.

실제로, 이것은 게으른로드하는 동안 다른 고유 키에로드를 할 수 있어야하지만 현재 구현은이를 허용하지 않기 때문에 최대 절전 모드의 개선이 될 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top