1

Hibernate の熱心な読み込みと遅延読み込みについて質問があります。私は次の設定をしています:

public Person {
  int prsnId;
  Set<Preferences> preferences;
  Set<ContactDetails> contactDetails;

  //constructor

  //getters & setters
}

休止状態のマッピング:

<hibernate-mapping>
    <class name="be.bene.cris2.protocol.Person" table="BENE_CUST_PERSON" dynamic-update="true" dynamic-insert="true">
        <id name="prsnId" type="int">
            <column name="PRSN_ID" precision="10" scale="0" />
             <generator class="sequence">
                   <param name="sequence">CUST_PROR_SEQ</param>
            </generator>
        </id>
    <set access="field" name="preferences" table="PRSN_PREF" inverse="true">
        <key column="PRSN_ID" not-null="true"/>
        <one-to-many class="Preferences" not-found="ignore"/>
    </set>
    <set access="field" name="contactDetails" table="CNTCT_DETAILS" inverse="true">
        <key column="PRSN_ID" not-null="true"/>
        <one-to-many class="ContactDetails" not-found="ignore"/>
    </set>
    </class>
</hibernate-mapping>

次のクエリを実行すると、実行時に、たとえば設定を熱心にロードする必要があるが、contactDetails を遅延フェッチするか、まったくフェッチしないかを決定できるかどうか疑問に思います。

Criteria criteria = session.createCriteria(Person.class);
    criteria.setFirstResult(startRow)
        .setMaxResults(pageSize)
        .add(Restrictions.eq("prsnId", id))
        .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
    ;
List<Person> personList = criteria.list();

前もって感謝します。

4

1 に答える 1

1

を使用して関連付けを取得できます

criteria.setFetchMode("preferences", FetchMode.JOIN);

この場合、設定は同じクエリで人物とともに取得され、連絡先の詳細は遅延して取得されます (つまり、一連の連絡先の詳細に対してメソッドを呼び出した場合にのみ取得されます)。

setFirstResult()ただし、問題は、結合フェッチが機能しないsetMaxResults()ことです。これらは SQL ステートメントに直接適用され、SQL クエリによって返される最初の行と最大行数を設定するために使用されるためです。また、プリファレンスが結合フェッチされている場合、1 人の人物が複数の行 (プリファレンスごとに 1 行) に対応します。

于 2012-11-09T07:50:16.697 に答える