em.find(A.class, ...)
A ! +---B1 ! ! ! +---C ! ! ! +---D ! +---B2
C.setParent(B2); B2.add(C); B1.remove(C);
em.merge(A);
UPDATE C SET PARENT_B_ID = B1 WHERE ...
DELETE FROM D WHERE ...
...class T extends U...: @NotNull @XmlTransient @ManyToOne @JoinColumn(name = "parent_id", referencedColumnName = "ID") private U parent;
...class U...: @XmlElement(name = "...") @OneToMany(mappedBy = "parent", cascade = ALL, orphanRemoval = true) @OrderBy("sequenceIndex") private List<T> children = new LinkedList<T>();