我想在我的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个记录表
答案 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中找到更多信息。