Десериализовать JPA obect до JSON с отношениями - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть эти объекты с отношениями:

@Entity
@Table(name = "data_model")
public class DataModel {

    @Id
    @GeneratedValue
    @Column(name = "model_id")
    private Integer id;

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

    @OneToMany(mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<OutputField> outputFields;
}

и:

@Entity
@Table(name = "data_model_output_field")
public class OutputField {

    @Id
    @GeneratedValue
    @Column(name = "output_field_id")
    private Integer id;

    @Column(name = "sourceTable")
    private String sourceTable;

    @JsonIgnore
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "model_id")
    private DataModel dataModel;
}

, и я хочу десериализовать этот json в Java объект:

{
  "name": "New data model with join",
  "outputFields": [
    {
      "sourceTable": "r"
    },
    {
      "sourceTable": "ri"
    }
  ]
}

Когда я пытаюсь десериализовать его, используя Джексона, я получаю это: enter image description here Как я могу поместить родительскую ссылку в дочерний элемент, используя Джексона?

1 Ответ

0 голосов
/ 28 апреля 2020

Я решил это. Я использовал JsonManagedReference и JsonBackReference аннотации:

@Entity
@Table(name = "data_model")
public class DataModel {

    @Id
    @GeneratedValue
    @Column(name = "model_id")
    private Integer id;

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

    @JsonManagedReference(value = "outputFields")
    @OneToMany(mappedBy = "dataModel", cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.MERGE})
    private List<OutputField> outputFields;
}
@Entity
@Table(name = "data_model_output_field")
public class OutputField {

    @Id
    @GeneratedValue
    @Column(name = "output_field_id")
    private Integer id;

    @Column(name = "sourceTable")
    private String sourceTable;

    @JsonBackReference(value = "outputFields")
    @ManyToOne(optional = false, fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
    @JoinColumn(name = "model_id")
    private DataModel dataModel;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...