Spring + Hibernate:无法初始化代理没有会话 - 在DAO上发生异常时该怎么办?

时间:2012-01-17 12:40:36

标签: java hibernate spring spring-mvc

我的JSP页面上出现了could not initialize proxy no Session异常。

这是我的所作所为;

有Hibernate的DAO。这些不是特殊课程。他们只有Hibernate SessionFactory的自动装配实例。是的我使用纯Hibernate来访问数据库。

DAO类上的函数使用@Transactional(rollBackFor=Exception.class)注释,并相应地准备了我的弹簧配置。我的实体/控制器也配置了Annotations等。

我没有单独的服务类层。我的服务和DAO重叠。他们是一样的。如果服务类需要访问数据库,则只需使用@Repository注释,而不是@Service

直到出现这个错误,一切都运转良好。 (我有数百个类/ DAO /实体等)

现在,我需要在我的一个控制器上调用两个DAO / Service函数。当第一个抛出异常时,我只调用第二个DAO函数。

我需要根据某些条件抛出异常来回滚第一次DAO调用所做的更改。第二个调用只是为了向DB输入错误输入的用户显示一些信息。

我不知道为什么但是第二个DAO调用正在工作,它从DB获取类。然后我将这些类转发到我的控制器上的Model属性,以便我的JSP可以显示它们。

但是当我的JSP页面试图访问这些类的属性时,我得到了 could not initialize proxy no Session例外。

所以这是我的问题,我该怎么做才能避免这种错误。

我应该在第一次DAO调用时对hibernate事务/会话做些什么吗? 因为我什么都不做我只是得到一个会话,并获得/保存/更新等。我认为@Transactional属性将处理事务问题,@Repository属性处理会话问题。


我已经尝试过lazy / eager loading问题。 我已经在我的配置上添加了OpenSessionInViewFilter过滤器。

但他们都没有解决我的问题。

有任何建议/想法吗?

2 个答案:

答案 0 :(得分:1)

我现在解决了这个问题:)

问题在于我对Hibernate与Spring Framework如何工作的误解不幸:)

当我比较两个不同的Hibernate代理的值时,在JSP页面中发生异常,每个代理都从单独的Hibernate会话中获取。

正如我在问题中描述的那样,在第一次DAO调用中我得到了一个代理,然后,在第二次DAO调用时,我得到了另一个属于不同Hibernate会话的代理。因此,第一个代理是一个带有“封闭会话”的分离式hibernate代理,我得到了这个例外。

要解决此问题,如果您可以尝试创建分离代理,请持久化,然后比较它们的值。

但是我通过重构我的代码来解决这个问题,不打开两个不同的会话来从DB中获取值。

答案 1 :(得分:0)

Spring应该使用带有代理包装器的@Transactional注释来包装服务,该代理包装器将初始化事务,因此当您不需要在一个方法中使用多个事务时,不要手动执行此操作。

在XML配置中,您需要在每个使用@Transactional注释声明bean的XML文件中添加<tx-annotation-driven />