Jpa实体关系导致死循环

zpw*_*pal 4 spring json jackson

我正在使用 spring data jpa 来构建我的项目。有一个用户实体和一个业务实体。

\n\n
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)\n@JoinColumn(name = "user_id")\nprivate UserInformation belongUser;//\xe6\x89\x80\xe5\xb1\x9e\xe7\x94\xa8\xe6\x88\xb7\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的代码是 Biz 类的一部分。

\n\n
@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser")\nprivate Set<BizInformation> bizs = new HashSet<BizInformation>();\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 User 类的一部分

\n\n

问题是当我通过 RESTful api 获取 UserInfomation 时,它返回一个 BizInfo,然后在 BizInfo 内部返回 UserInfomation,最后导致 StackOverFlow 异常。

\n\n

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

\n

Chi*_*Dov 5

这个问题是由双向关系引起的。您可以使用 \n @JsonManagedReference@JsonBackReference

\n\n
    \n
  • @JsonManagedReference 是正常序列化的引用 \xe2\x80\x93 的前向部分。
  • \n
  • @JsonBackReference 是引用 \xe2\x80\x93 的后面部分,它将在序列化中被省略。
  • \n
\n\n

在您的情况下,您可以在 User 类中添加 @JsonManagedReference

\n\n
@OneToMany(cascade = CascadeType.ALL,mappedBy = "belongUser")\n@JsonManagedReference\nprivate Set<BizInformation> bizs = new HashSet<BizInformation>();\n
Run Code Online (Sandbox Code Playgroud)\n\n

和 Biz 类的 @JsonBackReference 将省略 UserInformation 序列化

\n\n
@ManyToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL)\n@JoinColumn(name = "user_id")\n@JsonBackReference\nprivate UserInformation belongUser;//\xe6\x89\x80\xe5\xb1\x9e\xe7\x94\xa8\xe6\x88\xb7\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还可以对要省略序列化的类使用@JsonIgnore

\n\n

更多细节:杰克逊双向关系和无限递归

\n