【发布时间】:2014-02-21 13:30:41
【问题描述】:
-
应用程序正在将“实时”实体序列化到数据库(即它们的代理、会话打开)。
当应用最终反序列化一个实体时,会有一个打开的 EntityManager 和每个人 很开心。
我无法对原始应用程序做任何事情,并且旧应用程序在序列化实体之前不会分离或驱逐实体。
-
现在我正在构建一个新应用程序,它也需要这些实体(从数据库中反序列化它们),但会将它们视为 DTO。这个新应用不使用 Hibernate,因此没有打开的 EntityManagers 或 Sessions 可用。
实体可以是任意类,所以我使用反射递归地遍历它们的属性。
我收到很多 LazyInitializationException。以前没有加载的属性实际上并不需要,所以我忽略了这些异常。
但我测试的 JSON 库(JSONSerializer、GSON)不是那么宽容,在尝试将实体序列化为字符串时会中断。
问题:如何告诉实体它已分离,并且不应该尝试加载任何尚未加载的属性? (返回 null 而不是 LazyInitializationException。)
编辑请不要告诉我更改旧的应用程序。我不能。实体类像现在一样被密封,因为它们是在旧应用程序(仍在使用)中定义的,并且对于这个项目,我不允许更改遗留源代码。 如果唯一的答案是在新应用程序中开始使用 Hibernate,请务必这样说。
【问题讨论】:
-
在我看来,您不希望 GSON 序列化这些属性,而是尝试解决您的设计缺陷;我会调查API,看看你是否可以以某种方式使属性瞬态。不过,我希望您做出正确的选择并开始使用托管实体。
-
我认为在新应用程序中使用 Hibernate 会有点过头,因为它只执行简单的查询,并且永远不会将任何数据保存在数据库中。现在我只是从 JSON 序列化中排除有问题的属性。
-
@Gimby,第一点是的。请详细说明如何在不接触类源代码的情况下使属性瞬态。
-
不要询问,而是检查 API 的文档,看看是否有可能。如果没有,那就艰难的休息。
-
请不要回复RTFM,不礼貌。据我所知,分离实体的唯一方法是有一个开放的休眠会话来分离。我问是因为也许有人知道我还没有找到的东西。
标签: java hibernate deserialization