【发布时间】:2015-07-21 16:33:46
【问题描述】:
我的 web 应用程序的许多地方都有一个简单的场景 - 当显示对象列表时,我不想查询所有详细信息(即子对象),但是当我向用户显示单个对象时编辑,我确实想查询整个对象。所以我让 Hibernate 默认延迟获取这些子对象以获取列表,并希望在运行时使用 fetch = JOIN 覆盖它。我尝试了 2 种方法,这两种方法都应该有效,但都无效!
这是我的映射文件:
<hibernate-mapping>
<class name="User" table="User">
<id name="objectId" type="java.lang.Integer">
<column name="Object_ID" />
<generator class="identity" />
</id>
<many-to-one name="address" class="Address" cascade="save-update" >
<column name="Address_ID" not-null="true"/>
</many-to-one>
... other User properties ...
</hibernate-mapping>
首先,我尝试查询默认的惰性用户对象,然后使用 Hibernate.initialize() 加载惰性子对象:
User user = session.get(User.class, (Serializable) id);
if ( !Hibernate.isInitialized(user.getAddress()) )
Hibernate.initialize(user.getAddress());
}
Hibernate 认识到子地址对象没有加载,但 initialize() 仍然没有加载地址。为什么?
接下来我尝试了一个 fetch-profile,将它添加到 Hibernate 映射文件中:
<fetch-profile name="returnEntireUser">
<fetch entity="User" association="address" style="join"/>
</fetch-profile>
然后使用代码:
User u1 = session.get(User.class, (Serializable) id);
session.enableFetchProfile("returnEntireUser");
User u2 = session.get(User.class, (Serializable) id);
而且 u1 和 u2 对象都是相同的 - 都没有填写 Address 对象。我知道 Hibernate 可以识别提取配置文件,但仍然没有做任何事情。
谁能弄清楚为什么这些方法不起作用以及我可以做些什么来让它们起作用
【问题讨论】: