如何在 hbm 文件中使用 fetch="join"?

Posted

技术标签:

【中文标题】如何在 hbm 文件中使用 fetch="join"?【英文标题】:how to Use fetch="join" in hbm file? 【发布时间】:2014-11-07 11:15:08 【问题描述】:

在这个question 中,我想使用fetch="join" 使用单个选择查询来检索集合。我对 user.hbm 文件进行了以下更改。

  <set name="phones"  table="PHONE_NUMBERS" cascade="all"  

lazy="false" fetch="join">
        <key column="UNID"/>
        <one-to-many class="PhoneNumber"/>
    </set>

但它仍然会触发多个查询。我还尝试在两个 hbms 上添加 fetch="join",但没有成功。怎么了?

【问题讨论】:

【参考方案1】:

一般来说你是对的 - 如文档中所述:

5.1.7. Mapping one to one and one to many associations

小引:

... 但是,您可以调整获取策略,即使用@Fetch 获取数据的方式。 FetchMode 可以是 SELECT(需要加载关联时触发选择)或 JOIN(在加载所有者实体时使用 SQL JOIN 加载关联)。 JOIN 会覆盖任何惰性属性(通过 JOIN 策略加载的关联不能是惰性的)...

但是,referenced question above 正在获取您的根实体 USER,如下所示:

String hql = "from User ";
Query q = ses.createQuery(hql);

这意味着,您正在查询User。在这种情况下,不评估映射fetch="join"

我们可以通过显式 JOIN 来做到这一点

16.3. Associations and joins

来自文档的示例:

from Cat as cat
    join cat.mate as mate
    left join cat.kittens as kitten

所以在我们的例子中:

String hql = "from User as u join u.phones as p ";
Query q = ses.createQuery(hql);

最后 - 映射设置 fetch="join" 将在我们调用 .get()

时使用
User user = session.get(id);

【讨论】:

以上是关于如何在 hbm 文件中使用 fetch="join"?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate笔记--实体类映射文件"*.hbm.xml"详解

映射 hbm 文件时出现错误“命名空间中的元素 'class' 具有无效的子元素 'set'”

为啥即使使用 hibernate.hbm2ddl.auto" value="create",hibernate 也不会自动创建表?

如何在hbm中做多列UniqueConstraint?

在 Oracle SQL 中使用“Fetch First”后如何对行进行排序?

spring+hibernate hbm2ddl.auto 的问题