【问题标题】:Hibernate.initialize() doesn't seem to work on lazy loaded CollectionsHibernate.initialize() 似乎不适用于延迟加载的集合
【发布时间】:2012-03-22 20:03:42
【问题描述】:

我有一个 Hibernate 数据访问层,位于内存中的对象缓存后面。对于客户端缓存未命中,内存缓存将调用 Hibernate 层以将对象图加载到缓存中。由于对象如何序列化到缓存中,我需要一次从 Hibernate 加载整个对象图(即没有延迟加载)。 Hibernate 文档here 涵盖了这样的场景。以下是摘录:

在具有单独业务层的应用程序中,业务逻辑必须在返回之前“准备”Web 层所需的所有集合。这意味着业务层应该加载所有数据并将所有已初始化的数据返回到特定用例所需的表示/Web 层。通常,应用程序为 Web 层中需要的每个集合调用 Hibernate.initialize()(此调用必须在会话关闭之前发生)或使用带有 FETCH 子句或 FetchMode.JOIN 的 Hibernate 查询急切地检索集合在标准中。如果您采用命令模式而不是会话外观,这通常会更容易。

因为我不能直接在我的实体上启用 Eager fetching(我最终得到了 MultipleBagFetchException,如 this StackOverflow 问题中所述)我想我会保留默认的延迟加载行为,然后在每个集合上执行 Hibernate.initialize()使物体完全饱和。问题是我的收藏最终还是空的。

为了进一步混淆事情,这个策略在我的单元测试中似乎工作正常(我的对象已正确饱和)但是当我将此 Hibernate 层作为我的内存缓存的插件运行时(我提供了一个包含我的DAL 内存缓存将调用缓存未命中)我看到了所描述的行为。

目前我正在处理我的会话

    <property name="current_session_context_class">thread</property>

然后调用

    sessionFactory.getCurrentSession();

在我的 DAO 中,之后我会在我的会话中执行一个 get 以加载对象。据我所知,我的工作单元测试和非工作 DAO 的会话处理是相同的。关于这里发生的事情的任何建议。如果您想了解更多信息,请告诉我。

【问题讨论】:

    标签: java hibernate lazy-loading


    【解决方案1】:

    我有时也看到过这种情况,很想知道答案。作为一种解决方法,我使用了两种不同的方法来初始化孩子:

    1. 如果是收藏,请致电parent.getChildCollection().size()
    2. 在关联上使用Criteria 查询和FetchMode.JOIN

    这些似乎总是有效。

    【讨论】:

      【解决方案2】:

      我找到了答案,但它与我的 OP 暗示的所谓的错误集合初始化并没有真正的关系,但无论如何我都会在这里发布它,希望它可以帮助某人:

      问题是我用来识别对象的 UUID(作为字符串在整个服务层传递,原因在这里并不重要)在客户端以小写形式发送,而我的(成功)单元测试以大写形式发送 UUID 字符串。显然,数据库并不关心这种差异,并且能够至少返回图表的根级别对象,但鉴于根级别对象的小写 UUID 标识符字符串,后续连接以使集合饱和失败。有谁知道这可能是为什么?在我看来,无论 UUID 大小写如何,Hibernate 生成的 SQL 确实返回了正确的结果,但 Hibernate 最终丢弃了一些连接结果,因为 UUID 标识符在技术上不匹配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多