应用程序正在将“实时”实体序列化到数据库(即他们的代理,会话打开)。
当应用程序最终反序列化一个实体时,就会有一个开放的EntityManager和所有人 很高兴。
我无法对原始应用程序执行任何操作,旧应用程序在序列化之前不会分离或逐出实体。
现在我正在构建一个新应用程序,它还需要这些实体(从数据库中反序列化它们),但会将它们视为DTO。这个新应用程序不使用Hibernate,因此没有可用的开放EntityManagers或Sessions。
实体可以是任意类,因此我使用反射递归遍历它们的属性。
我收到了很多LazyInitializationException。之前未加载的属性并不是真正需要的,所以我只是忽略这些例外。
但我测试的JSON库(JSONSerializer,GSON)并不那么宽容,并且在尝试将实体序列化为字符串时会中断。
问题:如何告诉实体它已被分离,并且绝不应该尝试加载任何尚未加载的属性? (返回null而不是LazyInitializationException。)
编辑请不要告诉我更改旧应用程序。我不能。实体类现在是密封的,因为它们是在旧的应用程序中定义的(它仍然在使用中),对于这个项目,我不允许更改遗留源代码。 如果唯一的答案是在新应用程序中开始使用Hibernate,请说明。
答案 0 :(得分:0)
你的第三点有一个矛盾,如果你没有在你的新应用中使用Hibernate,你不应该遇到LazyInitialization异常。 关于你的问题本身,既然你没有使用Hibernate,那么实体又回到了POJO,你不必担心LazyInitializationException。 您能否提供有关您正在讨论的旧应用程序和新应用程序的更多信息。这些应用是什么类型的? 他们是在同一个jvm还是在不同的jvm上运行。我也不明白在你的用例中使用反射。