无法使用fetch-profile或hibernate.initialize()

时间:2015-07-21 16:33:46

标签: java hibernate

我在webapp中的很多地方都有一个简单的场景 - 当显示对象列表时,我不想查询所有细节(即子对象),但当我向用户显示一个对象时他们要编辑,我想查询整个对象。所以我让Hibernate默认为延迟获取这些子对象以获取列表,并希望在运行时使用fetch = JOIN覆盖它。我尝试了两种方法,这两种方法都应该有用,但不要!

这是我的映射文件:

<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>

首先,我尝试查询默认的惰性User对象,然后使用Hibernate.initialize()加载惰性子对象:

User user = session.get(User.class, (Serializable) id);

if ( !Hibernate.isInitialized(user.getAddress()) )
    Hibernate.initialize(user.getAddress());
}

Hibernate认识到子Address对象没有加载但是initialize()STILL没有加载地址。为什么呢?

接下来,我尝试了一个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识别获取配置文件,但仍然没有做任何事情。

任何人都可以找出为什么这些方法不起作用以及我可以做些什么来让它们起作用

1 个答案:

答案 0 :(得分:1)

好吧,我觉得有点愚蠢。上述两种方法实际上都可以工作,但是您不会在Eclipse调试器会话中看到结果。在代码的另一部分中,我使用了Criteria和

setFetchMode("field",FetchMode.JOIN);

方法,在这种情况下,调试器对象包含所有数据,因此我希望使用上述策略在调试器中看到完整对象,但它没有发生。

另外,对于ohers来说,由于Hibernate缓存了对象,因此无法在代码中背靠背地运行测试用例。调试器可能会也可能不会显示任何有意义的内容。