daybreaksnow's diary

私を私と呼びたい

[Hibernate]フェッチの設定

Root→Sub1→Sub2のように関連がある場合、関連するエンティティはデフォルトでは全て遅延フェッチされる(実際にアクセスされるまでSQLが発行されない)

hbmでfetch="join"を設定することで、常に同時にselectすることができる。

  <set name="fetchSub1s" table="fetch_sub1" inverse="true" fetch="join">
            <key>
                <column name="root_id" not-null="true" />
            </key>
            <one-to-many class="fetch.FetchSub1" />
        </set>


常にjoinが必要ということはまずないので、状況に応じてjoinするかどうか選択するには、criteriaのsetFetchModeを使う。

Criteria criteria = session.createCriteria(FetchRoot.class);
criteria.setFetchMode("fetchSub1s", FetchMode.JOIN);
criteria.setFetchMode("fetchSub1s.fetchSub2s", FetchMode.JOIN);