基于Spring注释的配置更改
我有一个使用Hibernate的spring MVC(3.1)web应用程序,它运行正常-今天,我尝试将配置完全转移到基于注释的配置(仅在代码配置中对spring尚不支持的安全内容使用xml) 经过一些调整后,我的应用程序启动时没有出现错误,并且主页加载正确-但是我看到Hibernate会话出现了一些不同的行为-即,在加载实际涉及Hibernate实体的页面时,我遇到了以下错误:基于Spring注释的配置更改,spring,spring-mvc,annotations,Spring,Spring Mvc,Annotations,我有一个使用Hibernate的spring MVC(3.1)web应用程序,它运行正常-今天,我尝试将配置完全转移到基于注释的配置(仅在代码配置中对spring尚不支持的安全内容使用xml) 经过一些调整后,我的应用程序启动时没有出现错误,并且主页加载正确-但是我看到Hibernate会话出现了一些不同的行为-即,在加载实际涉及Hibernate实体的页面时,我遇到了以下错误: org.hibernate.LazyInitializationException: failed to lazil
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.getConnections()
getConnections()
调用都是在加载Profile
之后直接进行的,因此即使是延迟加载,也会这样认为,它可以很容易地返回到数据库并按需加载连接
//@控制器代码
Account viewedUser=accountService.loadAccountByUserName(用户名);
put(“viewedUserConnections”,viewedUser.getUserProfile().getConnections())
//轮廓实体
@OneToMany(mappedBy=“user”,cascade=CascadeType.ALL)
私有列表连接=新建ArrayList()我可以发布我的前后xml vs annotation config,但我希望有人能为我指明切换过程中可能错过的某些配置的方向。您的假设主要是错误的: 在同一个方法调用中(因此我们这里不讨论分离的实体等) 该方法是控制器的一种方法。在典型的Spring应用程序中,控制器不是事务性的,而是服务。因此,除非您配置了“视图中打开的会话”过滤器或拦截器,否则当事务服务方法返回时,会话将关闭,因此控制器始终使用分离的实体 实际上,Profile.connections并不显式地声明fetchtype,因此应该默认为“急切加载” 没有。XXX默认情况下,许多关联都是惰性的
如果相同的代码在转换之前工作,我猜您在视图过滤器或拦截器中有一个打开的会话,并且您在迁移到注释时忘记了它。当然,是的,您是对的-我太愚蠢了。。第二点,我实际上刚刚测试过,但仍然是错误的。。谢谢