Объекты JPA с привязкой json (JSON-B) с использованием @JsonbTransient - PullRequest
0 голосов
/ 13 марта 2019

У меня много объектов JPA, которые имеют отношения 1..N.Я хотел бы сериализовать / десериализовать объекты в / из формата json с помощью JSON Binding (JSON-B).

Вот упрощенный пример кода:

public class Parent {
  @Id
  private long id; // 1

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parent", orphanRemoval = true)
  private List<Child> children;

  // getters & setters
}

public class Child {
  @Id
  private long id; // 10

  @JsonbTransient
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "parent_id")
  private Parent parent; // 1

  // getters & setters
}

JSON, сгенерированный из кода выше: {"id": 1, "children": [{"id": 10}]}

@ JsonbTransient необходимо, поскольку существует циклическая ссылка.В противном случае при сериализации сущности возникает ошибка:

org.eclipse.yasson.internal.Marshaller E Генерация неполного JSON

Конечно, родительский объект Child теперь имеет значение null, и выполняется слияниеследующий SQL:

ОБНОВЛЕНИЕ дочерний SET parent_id = null WHERE (id = 10)

Лучший обходной путь, который я придумал, это что-то вроде этого,но это не очень надежно, если количество сущностей увеличивается.

public void merge(Parent parent) {
  for ( Child child : parent.getChildren() ) {
    child.setParent(parent);
  }
  entityManager.merge(parent);
}

Вопрос: Есть ли лучший способ?Как бы вы это сделали?

...