【问题标题】:Detach/evict an entity long after session close (Hibernate)会话关闭后很长时间分离/驱逐实体(休眠)
【发布时间】:2014-02-21 13:30:41
【问题描述】:
  1. 应用程序正在将“实时”实体序列化到数据库(即它们的代理、会话打开)。

    当应用最终反序列化一个实体时,会有一个打开的 EntityManager 和每个人 很开心。

  2. 我无法对原始应用程序做任何事情,并且旧应用程序在序列化实体之前不会分离或驱逐实体。

  3. 现在我正在构建一个新应用程序,它也需要这些实体(从数据库中反序列化它们),但会将它们视为 DTO。这个新应用不使用 Hibernate,因此没有打开的 EntityManagers 或 Sessions 可用。

    实体可以是任意类,所以我使用反射递归地遍历它们的属性。

    我收到很多 LazyInitializationException。以前没有加载的属性实际上并不需要,所以我忽略了这些异常。

  4. 但我测试的 JSON 库(JSONSerializer、GSON)不是那么宽容,在尝试将实体序列化为字符串时会中断。

问题:如何告诉实体它已分离,并且不应该尝试加载任何尚未加载的属性? (返回 null 而不是 LazyInitializationException。)

编辑请不要告诉我更改旧的应用程序。我不能。实体类像现在一样被密封,因为它们是在旧应用程序(仍在使用)中定义的,并且对于这个项目,我不允许更改遗留源代码。 如果唯一的答案是在应用程序中开始使用 Hibernate,请务必这样说。

【问题讨论】:

  • 在我看来,您不希望 GSON 序列化这些属性,而是尝试解决您的设计缺陷;我会调查API,看看你是否可以以某种方式使属性瞬态。不过,我希望您做出正确的选择并开始使用托管实体。
  • 我认为在新应用程序中使用 Hibernate 会有点过头,因为它只执行简单的查询,并且永远不会将任何数据保存在数据库中。现在我只是从 JSON 序列化中排除有问题的属性。
  • @Gimby,第一点是的。请详细说明如何在不接触类源代码的情况下使属性瞬态。
  • 不要询问,而是检查 API 的文档,看看是否有可能。如果没有,那就艰难的休息。
  • 请不要回复RTFM,不礼貌。据我所知,分离实体的唯一方法是有一个开放的休眠会话来分离。我问是因为也许有人知道我还没有找到的东西。

标签: java hibernate deserialization


【解决方案1】:

您的第三点有矛盾,如果您在新应用中没有使用 Hibernate,则不应遇到 LazyInitialization 异常。 至于您的问题本身,由于您没有使用 Hibernate,因此实体将恢复为 POJO,您无需担心 LazyInitializationException。 您能否提供有关您正在谈论的旧应用程序和新应用程序的更多信息。这些是什么类型的应用程序? 它们是在同一个 jvm 上运行还是在不同的 jvm 上运行。我也不明白在您的用例中使用反射。

【讨论】:

  • 事实上我遇到了 LazyInitialization 异常。实体来自旧应用,从数据库反序列化。
  • 两个应用程序都是独立的。它们不会同时运行。它们仅通过数据库中的序列化对象“通信”。新的不会更改任何数据,只需访问它们进行报告。
  • 反射是必要的,因为新应用程序只是作为数据容器遍历对象,递归地访问它们的属性。 IE。没有(OriginalEntityClass)object,只有object.getClass().getDeclaredFields()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多