Hibernate多对多双向 - 双向@JsonManagedReference& @JsonBackReference

时间:2017-03-07 14:06:04

标签: java json hibernate jackson

为了避免无限递归我正在使用@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阻止了这一点。

是否可以在一个字段上同时使用注释并使其以两种方式工作。

1 个答案:

答案 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来停止对卸载的惰性属性的递归。 (我更喜欢同时使用)