hibernate没有做一个急切的提取(使用fetch =“join”和lazy =“false”)

时间:2012-12-20 17:51:14

标签: java mysql performance hibernate fetch

我想在我的webapplication中进行急切的提取。我在我的映射文件中有以下内容

<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);

Participand表有一些映射到其他表。他们的获取策略是相同的 这需要大约2秒多的时间来执行上面的查询,我可以看到hibernate生成的以下查询 1选择查询以获取10个帖子 20个参与者表格的选择查询(每个帖子有2个参与者)

1)为什么这样?为什么不进行单一加入?
2)我如何优化它?它花费了太多时间。现在只有10个记录表

1 个答案:

答案 0 :(得分:0)

只有在直接获取实体时才会在映射中设置lazy="false" fetch="join"

session.get(Post.class, postId);

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

from Post as p left join fetch p.user

与往常一样,此规则有许多变化和例外。您可以在Hibernate docs 16.3. Associations and joins中找到更多信息。