我的 JSP 页面上出现无法初始化代理无 session
异常。
这就是我所做的;
Hibernate 有 DAO。这些不是特殊类(class)。他们只有 Hibernate SessionFactory 的 Autowiring 实例。是的,我使用纯 Hibernate 来进行数据库访问。
DAO 类上的函数用 @Transactional(rollBackFor=Exception.class)
进行注释,并相应地准备了我的 spring 配置。另外,我的实体/ Controller 也配置了注释等。
我没有单独的服务类层。我的服务和 DAO 重叠。他们是一样的。如果服务类需要访问数据库,则只需使用 @Repository
注释,而不是 @Service
在出现此错误之前,一切都运行良好。 (我有数百个类/DAO/实体等)
现在,我需要在我的一个 Controller 上调用两个 DAO/服务函数。我仅在第一个 DAO 函数抛出异常时调用第二个 DAO 函数。
我需要根据某些条件抛出异常,以回滚第一次 DAO 调用所做的更改。第二次调用只是为了向输入错误的用户显示数据库中的一些信息。
我不知道为什么,但第二个 DAO 调用正在工作,它从数据库获取类。然后我将此类转发到 Controller 上的 Model 属性,以便我的 JSP 可以显示它们。
但是当我的 JSP 页面尝试访问这些类的属性时,我得到了
无法初始化代理,无 session
异常。
所以这是我的问题,我应该怎样做才能避免这个错误。
我应该在第一次 DAO 调用时对 hibernate 事务/ session 执行某些操作吗?
因为我什么都不做。我只是获得一个 session 并对其进行获取/保存/更新等操作。我认为 @Transactional
属性将处理事务问题,而 @Repository
属性将处理 session 问题。
我已经尝试过延迟/急切加载问题。
我已经在我的配置中添加了 OpenSessionInViewFilter
过滤器。
但他们都没有解决我的问题。
有什么建议/想法吗?
最佳答案
我现在解决了这个问题:)
不幸的是,问题是我对 Hibernate 与 Spring Framework 的工作原理的误解:)
当我比较两个不同 Hibernate 代理的值时,JSP 页面中发生了异常,每个代理都从单独的 Hibernate session 中获取。
正如我在问题中所描述的,在第一个 DAO 调用中,我得到了一个代理,然后,在第二个 DAO 调用中,我得到了另一个属于不同 Hibernate session 的代理。因此,第一个代理是一个具有“关闭 session ”的独立 hibernate 代理,我得到了这个异常。
要解决此问题,您可以尝试使分离代理持久化,然后比较它们的值。
但是我通过重构代码来解决这个问题,不要打开两个不同的 session 来从数据库获取值。
关于java - Spring + hibernate : could not initialize proxy no Session - What to do when an exception occured on a DAO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8894773/