如何在 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 也不会自动创建表?