gpt4 book ai didi

java - "No session or session was closed"与 hibernate + RMI

转载 作者:行者123 更新时间:2023-12-01 15:12:21 26 4
gpt4 key购买 nike

我正在使用 Visual Paradigm 开发一个 Java 项目,我需要使用它。 Visual Paradigm 使用 Hibernate。在我添加 Genady RMI 之前,我的项目运行良好。我还需要使用 RMI。

在服务器端,我有 MainDb 管理对数据库的所有查询,在客户端,我有 UserWindow 和 AdminWindow 类,它们实现 RMI Remote。这两个类通过RMI获取MainDb对象。

当我运行服务器和客户端时,出现与延迟初始化相关的异常,并显示错误“没有 session 或 session 已关闭”:

failed to lazily initialize a collection of role: dcl.UsuarioRegistrado.ORM_TieneVideosFavoritos, no session or session was closed.

据我所知,Hibernate 使用的是创建 dcl.UsuarioRegistrado 对象的不同 session 。问题是我不管理 session ,因为类 PersistentManager 仅提供 getSession()。 PersistentManager 类是 VisualParadigm 提供的用于管理 Hibernate 的类。

我尝试将所有实体配置为lazy="false",但结果更糟,因为某些实体的属性未正确加载。例如,加载对象“Topic”时,字符串属性“TopicName”为 null。

那么,我可以做什么来维持相同的 session ?

提前致谢,很抱歉我的英语很差。我很难用英语解释这种情况,所以再次感谢。

最佳答案

这是一个常见问题。当实体中有集合时,Hibernate 将在实例中注入(inject)“Hibernate 感知”集合。因此,您得到的不是列表,而是记住当前 session 的内容(“当前”=加载实体的 session )。

原因是 session ==数据库事务。如果 Hibernate 使用新 session 加载相关实体,那么您可能会看到新行、更新的行,或者可能会收到错误,因为加载父实体时仍然存在的行已被删除。这会很困惑。

为了确保这种情况不会发生,Hibernate 将使用原始 session 来加载所有相关实体。但代码的工作方式通常不同。在一部分中,您加载实体。 session 已结束。然后,在一个完全不相关的部分,您尝试加载子项 -> 错误。

解决方案有以下三种:

  1. 禁用延迟加载。这通常不起作用(加载太多,太慢)。但它不应该导致错误;您的代码中可能潜伏着一个错误。

  2. 加载实体时,从每个集合中获取第一个实体。这将正确初始化集合。这样做的好处是,您可以在代码中决定何时加载相关实例以及何时使用依赖 Hibernate 进行延迟加载。

    您也可以只加载您需要的关系;所以这通常可以解决上一点中的问题。缺点是您需要提前知道其他代码将如何使用您的实体。这通常很难甚至是不可能的。

  3. 您可以创建一个新 session 并使用 Session.refresh() 将现有对象“附加”到此新 session 。 。注意这里需要小心;如果混合刷新的对象和旧的对象,则会出现错误。

关于java - "No session or session was closed"与 hibernate + RMI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159091/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com