java - Spring + hibernate : could not initialize proxy no Session - What to do when an exception occured on a DAO?

标签 java hibernate spring spring-mvc

我的 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/

相关文章:

java - Maven 项目在 mac 中由于缺少tools.jar而无法编译

java - Android - AudioRecord 在channel_in_stereo 中分割2 个 channel

java - Spring在没有标记@Transactional的情况下不会提供当前 session

java - 从两个 Mono 对象获取属性,并使用 Reactor Java 将它们设置为第三个对象的属性

java - 如何在 apache Camel (spring) 中测试路由

java - 字符串分词器分离

java - 如何覆盖 Hibernate 中验证注释中的属性?

java - Hibernate 在多对多列表上创建别名

java - 如何将 Spring Retry 与 AsyncRestTemplate 集成

java - 将数据从 API 加载到 HBase