JPA (EclipseLink) дочерний элемент второго уровня сохраняется, только если не существует (как?) - PullRequest
0 голосов
/ 12 марта 2020

Какой будет наилучший подход (ы) JPA из соответствующего кода для сохранения значений для отношений ниже.

Предположим, у нас есть объекты, подобные приведенным ниже.

Отношения между объектами: родитель - первый уровень Child1 (второй уровень) зависит от Parent, Child2 (третий уровень) зависит от Parent и Child1.

@Entity
@Table(name = "PARENT") //all CRUD
public class Parent implements Serializable {
    @Id
    @Column(name = "SEQ_ID")
    @GenerateValue(strategy = GenerateType.SEQUENCE)
    private Long Id;

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child1> childs1 = new LinkedList<>();
}


@Entity
@Table(nam = "CHILD1") //the same CRUD as Parent entity
public class Child1 implements Serializable {
    @OneToOne (cascade = {CascadeType.?}) //MERGE, PERSIST, REFRESH?
    @JoinColumn(name = "CHILD1_REF"
    private Child2 child2;

    @Id
    @Column(name = "SEQ_ID")
    @GenerateValue(strategy = GenerateType.SEQUENCE)
    private Long Id;
}

@Entity
@Table(name = "CHILD2") //only create & read (could be update but not important)
public class Child2 implements Serializable {
    @Column(name = "VALUE1")
    private String value1;

    @Column(name = "VALUE2")
    private String value2;

    @Id
    @Column(name = "SEQ_ID")
    @GenerateValue(strategy = GenerateType.SEQUENCE)
    private Long Id;
}

Чего хотелось бы достичь:

  1. все операции для отношения между Parent и Child1, например, при удалении родительской сущности, наша сущность Child1 также должна быть удалена
  2. , тогда как сущность Child2 должна быть заблокирована только в том случае, если ее нет в базе данных (во время отслеживания Parent) и она не нужна. удалить Child2, если родитель удален

Любые java примеры? Что я должен изменить в своих классах сущностей и в псевдокоде ниже? (Я действительно не уверен, какой cascadeType следует использовать или пропустил что-либо).

EntityManager em = JpaManager.findEm()

if (parent.isNew()){
    em.persit(parent);
} else {
    em.merge(parent);
}
em.flush();

...