【发布时间】:2015-07-03 09:45:47
【问题描述】:
我在 Spring Web 应用程序中遇到很多 LazyLoadingException 问题,无论我尝试访问带有 FetchType.LAZY 注释的字段
Spring 中没有配置会话,因为要求 API 应该是无状态的。
所有服务层方法都正确设置了@Transactional 注释。
但是,当我尝试访问任何域对象上的惰性字段时,我得到了著名的 LazyInitializationException (...) could not initialize proxy - no Session
我认为当我使用 @Transactional 方法时,Hibernate 会在需要时自动加载惰性字段,但它似乎没有。
我花了几天的时间寻找答案,但没有一个能满足我的需要。我发现 Spring 可以使用 openSessionInViewFilter 进行配置,但它似乎会导致很多问题,而且我没有任何会话。
如何在@Transactionalannotated 服务方法中自动加载惰性字段,这样的无状态API?
我确定我在这里遗漏了一些明显的东西,但我对 Spring 和 Hibernate 不是很熟悉。
如果我的问题中缺少我应该给你的信息,请告诉我。
【问题讨论】:
-
您正在混合会话和无状态,但是这里的会话是休眠会话而不是 http 会话,因此与有状态或无状态的任何内容都无关。所以是的,您确实有会话,您没有
HttpSession,但你有来自休眠的Session。 2 种不同的东西。 -
好的,谢谢您的澄清。因此,如果 Hibernate 会话确实存在,为什么 Hibernate 不使用它来检索惰性字段,而是抛出 LazyInitializationException ?
-
因为那个时候,交易之后,它就不存在了。它绑定到事务边界,除非您使用
OpenSessionInViewFilter。要么使用它,要么在@Transactional带注释的方法中正确准备模型。 -
“我认为当我在 @Transactional 方法中需要时,Hibernate 会自动加载惰性字段” 是的,它应该自动加载它们。看来你还没有整合好Spring with Hibernate。
-
@singe31 一个简单的方法是调试您的应用程序。然后,您将看到 spring 创建的代理作为调用堆栈的一部分。
标签: java spring hibernate orm lazy-initialization