Spring MVC:无法初始化代理 - 没有Session(通过引用链)

时间:2015-10-20 05:17:56

标签: json spring

  

输入例外报告

     

message无法写入内容:懒得初始化角色集合:edu.waa.classified.dto.User.products,无法初始化代理 - 无会话(通过引用链:java.util.ArrayList [0] - > edu.waa.classified.dto.User ["产品"]);嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:懒得初始化一个角色集合:edu.waa.classified.dto.User.products,无法初始化代理 - 没有Session(通过引用链:java.util。 ArrayList的[0] - > edu.waa.classified.dto.User ["产品"])

     

说明服务器遇到内部错误,导致无法完成此请求。

4 个答案:

答案 0 :(得分:5)

我刚刚在@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;

答案 1 :(得分:4)

问题是你的FetchType.lazy。当Jackson转换用户实体时,它会尝试加载产品但是休眠会话已关闭。

因此添加@JsonIgnore是解决此问题的一种方法,但是当您需要返回产品时,这也不是选择。

我找到了这个答案,它为我解决了同样的问题并给了我延迟加载类型: https://stackoverflow.com/a/21760361

这个解决方案的好处是,您仍然可以使用延迟加载产品。

答案 2 :(得分:0)

我猜你的控制器已经超出了休眠会话。 (没有@Transactional)。但是您的json列表希望在该会话之外填写。但是hibernate充满了代理而不是真正的数据,而在hibernate会话之外,当你尝试访问时它无法加载那些数据。 JsonIgnore没有要求提供这些数据,所以它有效。或者,如果您想在json对象中使用该数据,请执行fetchtype EAGER。然后hibernate立即加载它们。如果只想在特殊情况下使用该列表,请将其保留为LAZY,然后在服务层上以特殊方法访问它,该方法具有注释@transactional。然后hibernate能够填充该列表。

答案 3 :(得分:0)

我也遇到了同样的问题。我刚刚在我的Entity类中添加了下面的注释(就在实体类之前)。它确实可以胜任。

@Entity @Table(name="Country") @Proxy(lazy = false) public class Country {}
相关问题