您好我有一个网络应用程序spring + hibernate
我jsp我试图读取产品的状态
<p>${product.state }</p>
在我的POJO课程中
public class Product
{
...
public String getState(){
if(this.type == 6)
return "A";
if(propertyB.getRole()== 15)
return "B"
}
}
当一个产品想要访问另一个像propertyB
这样的实体的属性时抛出
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
因为我用LEFT JOIN FETCH
FROM Product p LEFT JOIN FETCH p.propertyB b
当我在Junit测试中获得我的产品清单工作
当我在我的jsp文件中获得我的产品列表时抛出
javax.el.ELException:org.hibernate.LazyInitializationException:could 不初始化代理 - 没有会话
当我在控制器中获得我的产品列表时
for(Product p: listOfProducts){
log.put(p.getState());
}
工作正常!!
但只有在jsp中没有工作为什么?
答案 0 :(得分:2)
使用OpenEntityManagerInViewFilter。它是一个过滤器,它将数据库会话附加到呈现jsp的线程。
您可以像在任何其他J2EE过滤器中一样在web.xml中进行设置。
答案 1 :(得分:0)
在将Hibernate.initialize(yourObject)
传递给模型之前尝试使用{{1}}。
答案 2 :(得分:0)
如果要自动解析子属性,请将其设置为Eager fetch。如果没有,您将需要查询传递父项ID的子项。后者可能是首选的方式(至少对我来说),因为你可能并不总是需要急切地抓住孩子。但是这需要一个新的休眠会话。
我认为通过单元测试,您可以在每次测试之前初始化会话。