繁体   English   中英

休眠状态不进行紧急获取(使用fetch =“ join”和lazy =“ false”)

[英]hibernate not doing a eager fetch (using fetch=“join” and lazy=“false”)

我想在我的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秒钟以上的时间,我可以看到由休眠生成的以下查询1选择查询以获取10张贴20选择查询参与者表(如每个帖子有2位参与者)

1)为什么呢? 为什么不进行单个联接?
2)我该如何优化呢?这花费了太多时间。该表现在只有10条记录

仅在直接获取实体时,在映射中设置lazy="false" fetch="join"才有效:

session.get(Post.class, postId);

查询时,您需要明确声明获取策略。 否则它将仍然是懒惰的:

from Post as p left join fetch p.user

像往常一样,此规则有很多变体和例外。 您可以在Hibernate文档16.3中找到更多信息 协会和加入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM