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