我有一个使用Hibernate的Spring MVC(3.1)Web应用程序,它运行正常 - 今天,我已经尝试将配置完全转移到基于注释的配置(仅使用xml作为Spring尚未支持的安全性内容)在代码配置中。)
经过一些调整后,我得到的应用程序从没有错误开始,主页加载正确 - 但是我看到Hibernate会话有一些不同的行为 - 即,我在加载实际触及Hibernate实体的页面时收到以下错误:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.tmm.web.domain.Profile.connections, no session or session was closed
在以下情况中会发生这种情况:
@Controller
并加载用户Profile
对象profile.getConnections()
Profile.connections实际上并没有显式声明一个fetchtype,所以默认情况下应该是eager load(我的理解是什么?),但不管怎样,getConnections()
调用都是在加载{{}之后直接调用的。 1}} - 所以即使它被懒惰地加载也会如此,它可以很容易地回到数据库并按需加载连接。
// @控制器代码 Account seenUser = accountService.loadAccountByUserName(userName); model.put(“seenUserConnections”,seenUser.getUserProfile()。getConnections());
//个人资料实体 @OneToMany(mappedBy =“user”,cascade = CascadeType.ALL) private List connections = new ArrayList();
现在,我知道延迟加载等,所以这不是一个问题 - 就像我提到所有Hibernate的东西都正常工作 - 所以我的问题是,Spring配置可能会影响这种行为?
我可以在xml vs annotation配置之前和之后发布,但我希望有人可以指出我可能在切换时错过的某些配置的方向。
答案 0 :(得分:2)
您的假设主要是错误的:
在相同的方法调用中(所以我们不在这里讨论分离的实体等)
该方法是控制器的方法。在典型的Spring应用程序中,控制器不是事务性的,而是服务式的。因此,除非您配置了“在视图中打开会话”过滤器或拦截器,否则会在事务服务方法返回时关闭会话,因此控制器始终使用分离的实体
Profile.connections实际上并没有显式声明一个fetchtype,所以默认情况下应该是eager load
没有。默认情况下,XxxToMany关联是惰性的。
如果相同的代码在转换之前有效,我的猜测是你在视图过滤器或拦截器中有一个打开的会话,并且你在迁移到注释时忘了它。