Java Hibernate.initialize()不';似乎无法处理延迟加载的集合

Java Hibernate.initialize()不';似乎无法处理延迟加载的集合,java,hibernate,lazy-loading,Java,Hibernate,Lazy Loading,我在内存对象缓存后面有一个Hibernate数据访问层。对于客户端缓存未命中,内存中的缓存将调用Hibernate层将对象图加载到缓存中。由于对象是如何序列化到缓存中的,我需要一次从Hibernate加载整个对象图(即无延迟加载)。Hibernate文档中介绍了类似的场景。以下是摘录: 在具有独立业务层的应用程序中,业务逻辑必须在返回之前“准备”web层需要的所有集合。这意味着业务层应加载所有数据,并将已初始化的所有数据返回到特定用例所需的表示层/web层。通常,应用程序会为web层中需要的每个

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

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

因为我不能直接在我的实体上启用即时抓取(我最终得到了StackOverflow问题中记录的MultipleBagFetchException),所以我想我应该保持默认的延迟加载行为,然后对对象中的每个集合执行
Hibernate.initialize()
,以便使对象完全饱和。问题是我的收藏最终还是空的

为了进一步混淆这一点,这种策略在我的单元测试中似乎运行得很好(我的对象被正确地饱和了),但当我将这个Hibernate层作为内存缓存的插件运行时(我提供了一个包含DAL的jar,内存缓存将调用该DAL来缓存未命中),我看到了所描述的行为

目前,我正在处理与

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

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

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

  • 如果它是一个集合,请调用
    parent.getChildCollection().size()
  • 条件
    查询与
    FetchMode一起使用。在关联上加入

  • 这些似乎总是有效的。

    我找到了答案,但它与我的OP所暗示的假定的错误集合初始化并没有真正的联系,但我还是将其发布在这里,希望它能帮助某些人:

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

        sessionFactory.getCurrentSession();