【问题标题】:Cannot override Hibernate lazy fetching with fetch-profile OR hibernate.initialize()无法使用 fetch-profile 或 hibernate.initialize() 覆盖 Hibernate 延迟获取
【发布时间】: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 可以识别提取配置文件,但仍然没有做任何事情。

谁能弄清楚为什么这些方法不起作用以及我可以做些什么来让它们起作用

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    好吧,我觉得有点傻。上述两种方法都确实有效,但是您不会在 Eclipse 调试器会话中看到结果。在另一段代码中,我使用了 Criteria 和

    setFetchMode("field",FetchMode.JOIN);
    

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

    还请其他人注意,由于 Hibernate 缓存了对象,因此您不能在代码中背靠背地在同一对象上运行测试用例。调试器可能显示也可能不显示任何有意义的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2012-07-16
      • 1970-01-01
      相关资源
      最近更新 更多