我的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
过滤器。
但他们都没有解决我的问题。
有任何建议/想法吗?
答案 0 :(得分:1)
我现在解决了这个问题:)
问题在于我对Hibernate与Spring Framework如何工作的误解不幸:)
当我比较两个不同的Hibernate代理的值时,在JSP页面中发生异常,每个代理都从单独的Hibernate会话中获取。
正如我在问题中描述的那样,在第一次DAO调用中我得到了一个代理,然后,在第二次DAO调用时,我得到了另一个属于不同Hibernate会话的代理。因此,第一个代理是一个带有“封闭会话”的分离式hibernate代理,我得到了这个例外。
要解决此问题,如果您可以尝试创建分离代理,请持久化,然后比较它们的值。
但是我通过重构我的代码来解决这个问题,不打开两个不同的会话来从DB中获取值。
答案 1 :(得分:0)
Spring应该使用带有代理包装器的@Transactional注释来包装服务,该代理包装器将初始化事务,因此当您不需要在一个方法中使用多个事务时,不要手动执行此操作。
在XML配置中,您需要在每个使用@Transactional注释声明bean的XML文件中添加<tx-annotation-driven />
。