JPA一對多、多對多json序列化死循環問題解決

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

/**
 * Created by change.
 * 任務
 */
@Entity
@Table(name = "task")
@Data
public class TaskEntity implements Serializable {

    private static final long serialVersionUID = -8305163456196952851L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String target;

    @Column
    private int type;

    @Column(name = "start_at")
    private Date startAt;

    @Column(name = "end_at")
    private Date endAt;

    @Column(name = "data_path")
    private String dataPath;

    @Column
    private int status;

    @Column(name = "status_text")
    private String statusText;

    @Column
    private String description;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "taskEntity")
    private List<SearchPoliceEntity> searchPoliceEntityList;

}
import com.fasterxml.jackson.annotation.JsonBackReference;

import javax.persistence.*;
import java.io.Serializable;

/**
 * Created by challenge.
 * 搜索策略
 */
@Entity
@Table(name = "search_police")
@Data
public class SearchPoliceEntity implements Serializable {

    private static final long serialVersionUID = -2766200716493656577L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private int rate;

    @Column
    private String level;

    @Column(name = "snr")
    private String SNR;

    @ManyToOne
    @JoinColumn(name = "task_id")
    @JsonBackReference
    private TaskEntity taskEntity;
}

json序列化的對象中存在雙向引用會導致的無限遞歸(infinite recursion)問題。
使用@JsonBackReference標記在有多對一或者多對多關係的屬性上即可解決這個問題。

ps:
@JsonManagedReference:標記的屬性會被序列化,序列化時屬性默認都是會被序列化的。反序列(deserialization,即json數據轉換爲對象)時,如果沒有@JsonManagedReference,則不會自動注入@JsonBackReference標註的屬性。
@JsonIgnore:直接忽略某個屬性,以斷開無限遞歸,序列化或反序列化均忽略。當然如果標註在get、set方法中,則可以分開控制,序列化對應的是get方法,反序列化對應的是set方法。在父子關係中,當反序列化時,@JsonIgnore不會自動注入被忽略的屬性值(父或子),這是它跟@JsonBackReference和@JsonManagedReference最大的區別。

作者:宋欣聰
鏈接:https://www.jianshu.com/p/d9a78133c48f
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章