【发布时间】: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