簡體   English   中英

僅在jsp javax.el.E​​LException:org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話

[英]Only in jsp javax.el.ELException: org.hibernate.LazyInitializationException: could not initialize proxy - no Session

您好我有一個Web應用程序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:無法初始化代理 - 沒有會話

當我在Controller中獲得我的產品列表時

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

工作正常!!

但只有在jsp中沒有工作原因?

使用OpenEntityManagerInViewFilter 它是一個過濾器,它將數據庫會話附加到呈現jsp的線程。

您可以像在任何其他J2EE過濾器中一樣在web.xml中進行設置。

在將Hibernate.initialize(yourObject)傳遞給模型之前,請嘗試使用它。

如果要自動解析子屬性,請將其設置為Eager fetch。 如果沒有,您將需要查詢傳遞父項ID的子項。 后者可能是首選的方式(至少對我來說),因為你可能並不總是需要急切地抓住孩子。 但是這需要一個新的休眠會話。

我認為通過單元測試,您可以在每次測試之前初始化會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM