自定义hibernate延迟加载实现

时间:2011-12-12 06:18:55

标签: java hibernate lazy-loading

我正在使用远程API调用来获取对象。使用延迟设置,在客户端访问lazy=true设置的子集时{0}抛出异常。我试图改变行为,以便不抛出异常。我在hibernate事件监听器中找到了"org.hibernate.LazyInitializationException",但无法获得大量的使用帮助。

我是在正确的轨道上吗?还是有其他方法可以解决这种情况?

2 个答案:

答案 0 :(得分:0)

如果每次使用实体时都需要集合,那么最好的方法是配置。默认情况下,集合是延迟加载的。您可以将它们配置为热切加载(换句话说:预加载)。每当您要求实体时,您将始终获得该集合。

但是,如果您在某些时候只需要收集(延迟加载旨在解决的方案),您有几个选择:

  • 考虑将集合与实体完全分开。对于 例如,不是让User有一个Addresses集合, 将它们分开,这样一旦你有了你的用户,你就可以打电话了 getAddressesForUser(User)分开。
  • 或者在服务器端编写专门调用的其他方法 每个实体上的集合,以便它们在之前预先加载 回到客户端。你所要做的就是调用size() 关于集合的方法。这绝对不是优雅,但有效 如果您无法将集合与实体分开 原因。

答案 1 :(得分:0)

对于延迟加载的关联,Hibernate将生成用于延迟初始化的代理。因此,您可以使用Hibenrate.isInitialize() API来确定该代理是否已初始化。因此,您可以根据初始化的代理控制流。如果代理未初始化,则尚未获取这些实体(在访问此类属性值时将发生平均加载),因此您可以控制流程。