在会话结束后很久就分离/逐出一个实体(Hibernate)

时间:2014-02-21 13:30:42

标签: java hibernate deserialization

  1. 应用程序正在将“实时”实体序列化到数据库(即他们的代理,会话打开)。

    当应用程序最终反序列化一个实体时,就会有一个开放的EntityManager和所有人 很高兴。

  2. 我无法对原始应用程序执行任何操作,旧应用程序在序列化之前不会分离或逐出实体。

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

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

    我收到了很多LazyInitializationException。之前未加载的属性并不是真正需要的,所以我只是忽略这些例外。

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

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

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

1 个答案:

答案 0 :(得分:0)

你的第三点有一个矛盾,如果你没有在你的新应用中使用Hibernate,你不应该遇到LazyInitialization异常。 关于你的问题本身,既然你没有使用Hibernate,那么实体又回到了POJO,你不必担心LazyInitializationException。 您能否提供有关您正在讨论的旧应用程序和新应用程序的更多信息。这些应用是什么类型的? 他们是在同一个jvm还是在不同的jvm上运行。我也不明白在你的用例中使用反射。