2017-10-12 30 views
2

我正在使用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,并最终导致出现StackOverflow异常。

我该如何解决这个问题?谢谢。

+0

无限循环的地方,但你不说。看起来这是JSON,这是绝对无关的JPA API – DN1

+0

@ DN1这是众所周知的JSON串行器行为(很多人说:错误,其他:功能) –

回答

2

此问题是由双向关系引起的。您可以使用 @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

+0

不错的问题和更好的答案 – Acewin

+1

这是一个非常常见的情况。试图将实体组织到json中的人通常会忘记循环。 – Acewin

+1

非常好的答案,完美的作品,感谢您的帮助 – zpwpal

1

另一种方法是使用@JsonIgnoreProperties

@JsonIgnoreProperties("bizs") 
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) 
@JoinColumn(name = "user_id") 
private UserInformation belongUser;