为了避免无限递归我正在使用@JsonManagedReference& @JsonBackReference。但是在检索结果时,我只能通过一种方式获得预期的结果。
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name="THIRD_TABLE",
joinColumns={@JoinColumn(name="STUDENT_ID")},
inverseJoinColumns={@JoinColumn(name="TEACHER_ID")})
@JsonManagedReference
private Set<Teacher> teachers = new HashSet<>();
-----------
@ManyToMany(mappedBy="teachers")
@JsonBackReference
private Set<Student> winners = new HashSet<>();
每个学生的教师都很好,但每个老师的学生都不能正常工作。 JsonBackReference阻止了这一点。
是否可以在一个字段上同时使用注释并使其以两种方式工作。
答案 0 :(得分:1)
如果您只想避免递归,可以使用 @JsonIdentityInfo 。它将为每个对象生成id,并且如果重复,则用其id替换重复的对象。
这是一个简单的父/子示例:
write parent: {"@id":1,"children":[{"parent":1,"pseudo":"foo"},{"parent":1,"pseudo":"bar"}],"name":"parent"}
write child: {"parent":{"@id":1,"children":[{"parent":1,"pseudo":"foo"},{"parent":1,"pseudo":"bar"}],"name":"parent"},"pseudo":"foo"}
结果:
{{1}}
您看到子节点和父节点之间存在递归,如果删除@JsonIdentityInfo,则会有一个stackoverflow。
当然,您需要在某处停止递归,否则您将转储所有数据库!使用@jsonIgnore来停止某处的递归,或者使用Hibernate4Module来停止对卸载的惰性属性的递归。 (我更喜欢同时使用)