Объекты 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);
}
Вопрос: есть ли лучший способ? Как бы вы это сделали?