Java 在会话关闭后很长时间分离/逐出实体(休眠)

Java 在会话关闭后很长时间分离/逐出实体(休眠),java,hibernate,deserialization,Java,Hibernate,Deserialization,应用程序正在将“活动”实体序列化到数据库(即它们的代理、会话打开) 当应用程序最终反序列化一个实体时,会有一个开放的EntityManager和所有人 她很高兴 我无法对原始应用程序执行任何操作,旧应用程序在序列化实体之前不会分离或逐出实体 现在,我正在构建一个新的应用程序,它也需要这些实体(从数据库中反序列化它们),但将它们视为DTO。此新应用程序不使用Hibernate,因此没有可用的open EntityManager或会话 实体可以是任意类,因此我使用反射递归遍历它们的属性 我有很多懒洋

应用程序正在将“活动”实体序列化到数据库(即它们的代理、会话打开)

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

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

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

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

    我有很多懒洋洋的事。以前没有加载的属性实际上并不需要,所以我只忽略这些异常

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

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

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

    你的第三点有矛盾,如果你没有在新应用程序中使用Hibernate,你不应该遇到LazyInitialization异常。 至于您的问题本身,因为您没有使用Hibernate,所以该实体回到POJO,您不需要担心LazyInitializationException。 您能否提供更多关于您所谈论的新旧应用程序的信息。这些是什么样的应用程序?
    它们是在同一个jvm上运行还是在不同的jvm上运行。我也不理解反射在您的用例中的用法。

    在我看来,您不希望GSON序列化这些属性,而不是试图解决您的设计缺陷;我会调查API,看看是否可以以某种方式使属性暂时化。不过,我希望你能做出正确的选择,并开始使用托管实体。我认为在新应用程序中使用Hibernate未免有些过火,因为它只执行简单的查询,而且永远不会在数据库中保留任何数据。现在我只是从JSON序列化中排除有问题的属性。@Gimby,第一点是肯定的。请详细说明如何在不接触类源代码的情况下使属性变为瞬态。与其询问,不如查看API文档,看看是否可行。如果不是,那就很难了。请不要用RTFM回复,这是不礼貌的。就我所见,分离实体的唯一方法是有一个开放的hibernate会话来分离。我这么问是因为可能有人知道我还没有发现的东西。事实上,我遇到了懒惰的例外。实体来自旧应用程序,从数据库反序列化。两个应用程序都是独立的。它们不会同时运行。它们仅通过数据库中的序列化对象进行“通信”。新应用程序不会更改任何数据,只需访问它们以进行报告。反射是必要的,因为新应用程序只是作为数据容器遍历对象,递归地访问它们的属性。也就是说,没有
    (OriginalEntityClass)对象
    ,只有
    对象.getClass().getDeclaredFields()