1

Webアプリケーションで熱心なフェッチを行いたい.マッピングファイルで次のことを行っています

<many-to-one name="user" class="com.xyz.beans.User" lazy="false" fetch="join">
    <column name="startedBy" />
</many-to-one>
<many-to-one name="participantByParticipant1" class="com.xyz.beans.Participant" lazy="false" fetch="join" cascade="all" >
    <column name="participant1" />
</many-to-one>
<many-to-one name="participantByParticipant2" class="com.xyz.beans.Participant" lazy="false" fetch="join" cascade="all">
    <column name="participant2" />
</many-to-one>

私は次のようなクエリを持っています

Query query = session.createQuery("from Post as p order by challenge.createdOn desc");
query.setFirstResult(0);
query.setMaxResults(10);

参加者テーブルには他のテーブルへのマッピングがいくつかあります.そしてそれらのフェッチ戦略は同じです.これは上記のクエリを実行するのに約2秒以上かかります.休止状態によって生成された次のクエリを見ることができます.投稿ごとに2人の参加者があります)

1) どうしてですか?単一の結合を使用しないのはなぜですか?
2)これを最適化するにはどうすればよいですか?時間がかかりすぎます。テーブルは現在10レコードしかありません

4

1 に答える 1

0

マッピングの設定lazy="false" fetch="join"は、エンティティを直接取得する場合にのみ効果があります。

session.get(Post.class, postId);

クエリを実行するときは、フェッチ戦略を明示的に宣言する必要があります。そうしないと、まだ怠惰になります。

from Post as p left join fetch p.user

いつものように、このルールには多くのバリエーションと例外があります。Hibernate docs 16.3 で詳細を確認できます。関連付けと結合

于 2016-10-07T10:37:49.400 に答える