在 Hibernate 或者 ORM 映射中,我們可能會存在 1 對多的情況。
在這個時候,如果你使用 Jackson 將對象序列化的時候,就會出現雙向引用導致的無限遞歸(infinite recursion)的情況。
@JsonManagedReference 和 @JsonBackReference 注解就是為了避免這個雙向引用的情況。
@JsonBackReference 和 @JsonManagedReference:這兩個標注通常配對使用,通常用在父子關系中。
假設我們有 2 個對象。
一個對象是 QIndex 和 QTitle
一個 QIndex 可能對應有多個 QTitle。
那么在 JPA 中的對應關系的 QIndex 應該定義為:
@OneToMany(mappedBy = "qIndex", cascade = CascadeType.ALL, orphanRemoval = true) @OrderBy("questionNumber ASC") @JsonManagedReference private List<QTitle> qTitleList = new ArrayList<>();
在 JPA 的 QTitle 中應該定義為:
@ManyToOne() @JsonBackReference private QIndex qIndex;
在序列化的時候,@JsonManagedReference 注解的屬性則會被序列化,@JsonBackReference 的注解將會被忽略。
@JsonManagedReference 注解,通常說明這個字段是一個雙向引用的字段,這個字段在這個雙向引用中的角色為 “父”,與這個字段對應的引用需要注解為 @JsonBackReference。
@JsonBackReference 注解,通常說明這個字段是關聯的一個雙向引用字段,這個字段在這個雙向引用的角色是 “孩子”。這個字段的值只能是對象(Bean),不能是 集合(Collection),圖(Map),數組(Array)和枚舉類型(enumeration)。
總結
- @JsonManagedReference 和 @JsonBackReference 總是成對出現的
- @JsonManagedReference 定義在父級角色
- @JsonBackReference 定義在孩子級角色
- @JsonBackReference 不能使用任何集合和數組等多的數據結構
有了上面的解釋,應該比較容易的理解為了避免雙向引用導致無限遞歸而出現的問題的。
https://www.ossez.com/t/jackson-jsonmanagedreference-jsonbackreference/574