gpt4 book ai didi

java - JPA ManyToMany 关系和 JSON 序列化

转载 作者:行者123 更新时间:2023-11-29 10:15:10 25 4
gpt4 key购买 nike

我正在使用 Spring Framework v3.2.4 和 JPA + Hibernate 4 实现 RESTful 服务。我正在返回 JSON 格式的资源(使用 Jackson Mapper),但现在我遇到了这个异常:

Could not write JSON: failed to lazily initialize a collection of role: it.teck.service.model.Canvas.params, could not initialize proxy - no Session (through reference chain: it.teck.service.model.Canvas["params"]);

我在 CanvasParam 实体之间存在“多对多”关系,当向服务请求 Canvas 时,我还需要序列化参数列表。

在我的类(class)中我有:

@Entity
public class Canvass {

@ManyToMany
@JoinTable(name = "canvas_params", joinColumns = { @JoinColumn(name = "id_canvas", referencedColumnName = "id_canvas") }, inverseJoinColumns = { @JoinColumn(name = "id_param", referencedColumnName = "id_param") })
private List<Param> params;

// ...
}

和:

@Entity
public class Param {

@ManyToMany(mappedBy = "params")
private List<Canvas> canvasList;

// ...
}

在一些帖子和 SO 答案中,建议从序列化中排除 ManyToMany 字段,以打破序列化循环,但我需要序列化链接到我的 Canvas 实体的参数。那么,我该怎么办?

最佳答案

由于序列化时的 Hibernate 延迟加载,您最终会得到 Hibernate 代理集合。此时 session 已经关闭或不在范围内。您可以编写一个在范围内具有 JPA 实体管理器的自定义转换器(查找 OpenEntityManagerInViewFilter 示例),或者如果性能不是问题(集合相当小)并且您始终需要完全填充的对象,您可以在映射上指定一个急切的获取策略:

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "canvas_params", joinColumns = { @JoinColumn(name = "id_canvas", referencedColumnName = "id_canvas") }, inverseJoinColumns = { @JoinColumn(name = "id_param", referencedColumnName = "id_param") })
private List<Param> params;

关于java - JPA ManyToMany 关系和 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19856603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com