带关系的JSON序列化和@JsonIdentityInfo

时间:2017-10-24 09:12:57

标签: java json spring-boot serialization jackson

我有两个班级:

@Entity
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id")
public class Client extends AbstractEntity {

    ...

    @OneToMany(mappedBy = "client", fetch = FetchType.EAGER)
    @Cascade(org.hibernate.annotations.CascadeType.PERSIST)
    private Set<Patient> patients = new HashSet<>();

@Entity
@JsonIdentityInfo(
    generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "id")
 public class Patient extends AbstractLastOpenedDateEntity implements Serializable {

    ...

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "client_id")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Client client;

假设我有一份患者名单: - 患者A(来自客户1) - 患者B(来自客户1) -patient C(来自客户2) 当我使用Jackson序列化它时我想要的是什么:

[
   { id: A, client: { id: 1, patients: [A,B]}  },
   { id: B, client: { id: 1, patients: [A,B]}  },
   { id: C, client: { id: 2, patients: [C]}  },
]

但这是我得到的:

[
   { id: A, client: { id: 1, patients: [ A , { id: B, client: { id: 1, patients: [A,B]}]}  },
   B,
   { id: C, client: { id: 2, patients: [C]}  },
]

杰克逊似乎做了一个完整的序列化&#34;只是第一次,然后它做了一个&#34;短序列化&#34; (ID)。 我希望拥有完整的序列化优先级&#34; root&#34; json等级。

谢谢!

1 个答案:

答案 0 :(得分:0)

在患者Set中使用@JsonIdentityReference(alwaysAsId = true)注释。 问题是@JsonIdentityInfo将仅完全序列化一个 默认情况下,对象在整个序列化过程中都会出现。