Spring中的LazyInitializationException

时间:2010-04-29 09:59:41

标签: hibernate spring spring-mvc spring-security lazy-loading

我的Spring应用程序中出现了LazyInitializationException。我已经配置了OpenEntityManagerInViewFilter,所以我将所有关系设置为FetchType.LAZY,它们都有效。问题是当我尝试通过Spring Security访问会话中的用户并在JSP中打印LAZY信息时,如下所示:

<sec:authentication property="principal" var="userAuth"/>
${userAuth.organisation.id}

我得到了

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

虽然我可以毫无问题地执行$ {userAuth.username}

我有一个自定义身份验证提供程序,它只是一个使用Hibernate加载用户的DAO

 <sec:authentication-provider user-service-ref="userDAOImpl">

奇怪的是,当我将组织对象设置为EAGER时,我遇到了同样的问题。

问题只发生在我尝试通过sec:authentication进行访问时。如果我将用户添加到模型中,然后访问jsp中的数据就可以了。

为什么我无法访问存储在链接到用户的Object中的数据?

由于

1 个答案:

答案 0 :(得分:6)

因为您在用户登录时获取了主要信息,并在那时将它们存储在http会话中。

如果您尝试在以后的任何http请求中访问该对象的非初始化集合,则会关闭hibernate会话(获取主体的位置)(就在登录后),并且您将获得LazyInitializationException