2015-10-20 74 views
1

類型異常報告Spring MVC的:無法初始化代理 - 沒有會話(通過參考鏈)

消息無法寫入內容:無法初始化懶洋洋角色的集合:edu.waa.classified.dto。 User.products,無法初始化代理 - 沒有會話(通過引用鏈:java.util.ArrayList [0] - > edu.waa.classified.dto.User [「products」]);嵌套異常是com.fasterxml.jackson.databind.JsonMappingException:未能延遲初始化角色集合:edu.waa.classified.dto.User.products,無法初始化代理 - 無Session(通過引用鏈:java.util。 ArrayList [0] - > edu.waa.classified.dto.User [「products」])

說明服務器遇到內部錯誤,導致它無法完成此請求。

+1

請發佈一些代碼 – MohitC

回答

4

我剛剛在@ManyToMany(fetch = FetchType.LAZY,cascade = CascadeType.ALL)註釋之後添加了@JsonIgnore。有效。 但不知道爲什麼它的工作。

@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
@JoinTable(name = "WISHLIST", joinColumns = { 
     @JoinColumn(name = "userId", referencedColumnName = "id") }, inverseJoinColumns = { 
       @JoinColumn(name = "productId", referencedColumnName = "id") }) 
@JsonIgnore 
private List<Product> products; 
+2

以前,您的應用程序試圖在會話關閉後獲取產品列表以形成json對象。現在你告訴Json解析器忽略產品列表不要在構建json響應時填充它。所以NP。 – Lovababu

0

我想你的控制器是休眠會話。 (沒有@Transactional)。但是你的json列表想要在該會話之外填寫。但是hibernate充滿了代理而不是實際的數據,而在外部休眠會話中,當你嘗試訪問時它不能加載這些數據。 JsonIgnore不會要求這些數據,所以它可以工作。或者,如果你想在你的JSON對象中的數據,請獲取EAGER類型。然後休眠立即加載它們。如果你只想在特殊情況下使用這個列表,請將其放在LAZY中,然後在服務層上使用特殊方法訪問它,該方法的註釋爲@transactional。然後休眠可以填充該列表。

4

問題是你的FetchType.lazy。當Jackson轉換用戶實體時,它會嘗試加載產品,但休眠會話已關閉。

因此,添加@JsonIgnore是解決這個問題的方法之一,但是當您需要返回產品時,這是不行的。

我發現這個答案,解決同樣的問題,對我,給了我懶惰加載類型: https://stackoverflow.com/a/21760361

這個解決方案的好處是,你仍然可以使用產品的延遲加載。

0

我可能會幫助別人。我也遇到了同樣的問題。我只是將下面的註釋添加到我的實體類(就在實體類之前)。它確實做了這項工作。

@Entity @Table(name="Country") @Proxy(lazy = false) public class Country {} 
相關問題