仅在jsp javax.el.E​​LException:org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话

时间:2013-12-17 22:07:56

标签: java spring hibernate jsp

您好我有一个网络应用程序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.E​​LException:org.hibernate.LazyInitializationException:could   不初始化代理 - 没有会话

当我在控制器中获得我的产品列表时

for(Product p: listOfProducts){
    log.put(p.getState());
}

工作正常!!

但只有在jsp中没有工作为什么?

3 个答案:

答案 0 :(得分:2)

使用OpenEntityManagerInViewFilter。它是一个过滤器,它将数据库会话附加到呈现jsp的线程。

您可以像在任何其他J2EE过滤器中一样在web.xml中进行设置。

答案 1 :(得分:0)

在将Hibernate.initialize(yourObject)传递给模型之前尝试使用{{1}}。

答案 2 :(得分:0)

如果要自动解析子属性,请将其设置为Eager fetch。如果没有,您将需要查询传递父项ID的子项。后者可能是首选的方式(至少对我来说),因为你可能并不总是需要急切地抓住孩子。但是这需要一个新的休眠会话。

我认为通过单元测试,您可以在每次测试之前初始化会话。