哪个Hibernate FetchMode会导致集合被延迟加载?

时间:2010-12-04 01:48:03

标签: java hibernate orm lazy-loading

我在Hibernate论坛上问过这个问题,但没有得到完整的答复,所以我想我会在这里重新发布。这是原始问题主题:

http://forum.hibernate.org/viewtopic.php?f=1&t=1008243&p=2438963#p2438963

简而言之,我有一个自定义HQL查询将两个完全无关的表连接在一起,我试图通过禁用加载我存在的关联集合来防止“O(N + 1)选择”问题Hibernate映射的POJO。

显然,我可以使用Hibernate fetch profiles,但是有一个障碍。以下是Hibernate的FetchMode.java所说的内容:

/**
 * Fetch using an outer join. Equivalent to <tt>fetch="join"</tt>.
 */
public static final FetchMode JOIN = new FetchMode("JOIN");
/**
 * Fetch eagerly, using a separate select. Equivalent to
 * <tt>fetch="select"</tt>.
 */
public static final FetchMode SELECT = new FetchMode("SELECT");

/**
 * Fetch lazily. Equivalent to <tt>outer-join="false"</tt>.
  * @deprecated use <tt>FetchMode.SELECT</tt>
 */
public static final FetchMode LAZY = SELECT;

所以,“LAZY”并不是很懒,它只是“SELECT”,这正是我想要避免的。

是否存在阻止加载集合的提取模式?如果没有,是否有其他方法可以在特定HQL查询过程中禁用集合加载?

我意识到完成此任务的传统方法是使用Criteria查询,但我需要对任意属性进行连接,据我所知,没有标准。

1 个答案:

答案 0 :(得分:5)

首先,我认为hibernate的默认行为是使用延迟加载。所以检查是否已经是这种情况。

然后,我相信他们错误地记录了文档中的注释,并且SELECT应该是一个懒惰的提取(如果你查看最新版本的hibernate的文档,那么'急切'这个词就被删除了)。