1

我想在我的网络应用程序中进行急切的获取。我的映射文件中有以下内容

<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 秒以上的时间来执行上面的查询,我可以看到 hibernate 1 选择查询生成的以下查询来获取参与者表的 10 个后 20 选择查询(如每个帖子有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 回答