【问题标题】:Avoiding Lazy Loading Exception while Serializing Hibernate Objects序列化休眠对象时避免延迟加载异常
【发布时间】:2013-03-27 20:59:34
【问题描述】:

我想将休眠对象添加到 HTTP 会话。 HTTP Session 参与集群环境并通过序列化进行复制。在序列化 HTTP 会话时,会抛出延迟加载异常,因为它超出了会话的范围。似乎应该有一种方法来指示休眠状态不要尝试序列化尚未延迟加载的对象。毕竟,那是对象图的状态,而序列化转储对象图的状态。如果一个对象只是一个代理,因为它没有被加载,那么只有代理应该被序列化。正确的?无论如何,这是我希望看到的行为。关于如何实现这一点的任何想法?

当然期望序列化的对象可以在另一台服务器上反序列化,并且会话将得到适当的处理。

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    在集群环境中,您可能只想在 HTTP 会话中存储 objectId。以便集群节点能够查询数据库中的真实节点。

    另一种选择是从 Hibernate Session 中分离 Hibernate 对象并对其进行序列化。 (在这种情况下,您可能需要初始化惰性字段)。为了初始化惰性加载字段,您可能需要使用this

    通常,如果您在服务器之间传递对象,则必须初始化所有延迟加载的字段,否则在序列化时会出现异常,因为您将无法序列化/反序列化休眠会话。

    是的,不要将 HTTP 会话与 Hibernate 会话混用。这些是完全不同的东西。

    【讨论】:

    • Funtik,感谢您的回复!这涉及到将 Hibernate 对象放在 HTTP 会话中的遗留应用程序。在将其部署到集群环境并使用序列化来复制状态之前,这一直很好。重构以仅存储对象 ID 将是一项艰巨的任务。我希望找到一个解决方案,让 Hibernate 避免序列化未加载的对象。
    • 在将对象添加到 HTTP 会话之前尝试从休眠会话中分离对象
    • Funti,另一个很好的建议,但遗憾的是在我的情况下这是可行的。该应用程序使用 Tapestry,它在幕后将某些类属性添加到会话中。因此,我无法看到将 Hibernate 对象添加到会话的位置。
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多