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

У меня есть много объектов 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, а merge выполняет следующий SQL:

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

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

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

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

0 ответов

Другие вопросы по тегам