Jpa实体关系造成无限循环
问题描述:
我正在使用spring数据jpa来构建我的项目。有一个用户实体和一个商务实体。Jpa实体关系造成无限循环
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private UserInformation belongUser;//所属用户
以上代码是Biz类的一部分。
@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser")
private Set<BizInformation> bizs = new HashSet<BizInformation>();
这是用户类的一部分
的问题是,当我通过基于REST的API一个UserInfomation,它返回一个商业信息,那么商业信息里面返回UserInfomation,并最终导致出现*异常。
我该如何解决这个问题?谢谢。
答
此问题是由双向关系引起的。您可以使用 @JsonManagedReference和@JsonBackReference
- @JsonManagedReference是参考前一部分 - 通常被序列化的一个。
- @JsonBackReference是引用的后面部分 - 它将从序列化中省略 。
您可以在用户类添加@JsonManagedReference
@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser")
@JsonManagedReference
private Set<BizInformation> bizs = new HashSet<BizInformation>();
和@JsonBackReference为商务类将省略UserInformation系列化
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
@JsonBackReference
private UserInformation belongUser;//所属用户
你也可以使用@JsonIgnore为您想要省略序列化的类
更多详细信息:jackson-bidirectional-relationships-and-infinite-recursion
答
另一种方法是使用@JsonIgnoreProperties
:
@JsonIgnoreProperties("bizs")
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private UserInformation belongUser;
无限循环的地方,但你不说。看起来这是JSON,这是绝对无关的JPA API – DN1
@ DN1这是众所周知的JSON串行器行为(很多人说:错误,其他:功能) –