ManyToOne关系,父级可以更新/删除/添加子级,但父级列表在保存/删除子级时也会更新,而无需级联

时间:2018-11-21 14:14:02

标签: java hibernate jpa spring-data

想象一个场景:

CREATE TABLE PARENT (id BIGINT, name VARCHAR);

CREATE TABLE CHILD (id BIGINT, name VARCHAR, parent_id BIGINT FOREIGN KEY REFERENCES PARENT(id));

在JPA实体中翻译的内容类似于:

Parent.java:

  @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "parent", orphanRemoval = true)
private List<Child> child;

Child.java:

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.PERSIST}) //Child should not modify parent (except for its List<> of childs)
@JoinColumn(name = "parentId", updatable = false, insertable = false)
private Parent parent;

我不知道如何实现以下设置:

  • 执行parentRepository.saveOrMerge(parent)时,集合上的父代及其子代均应保留。如果父级的子级Set已从db状态更新,则更改也应应用于子级表。 (我猜这是orphanRemoval标志)。如果特定孩子的状态发生了变化,那么它也应该保留(我猜这是父级的CascadeType.ALL)。
  • 当执行parentRepository.remove(parent)时,应同时删除父级及其子级。与ON DELETE CASCADE一样,即使被管理实体清除了Child Set,也应删除所有引用父级的内容。我不知道是否可以通过JPA。

  • 当执行childRepository.saveOrMerge(child)时,child应该是持久的,如果父对象没有持久化,那么还应该持久化child。如果父级位于db中,而子级具有修改后的实例,则应放弃更改。 (我猜这是updatable = false和insertable = true)标志

  • 执行childRepository.remove(child)时,应从db中删除child,并从内存中任何父级集合中删除child。如果这是父母唯一的孩子,则不应删除父母(我想这是孩子一方关系上的CascadeType.REMOVE的省略)

当前使用先前的代码,无法实现项目符号要点4。无论如何,如果我childRepository.remove(child)仅通过实体中的JPA注释,我可以指示应该自动更新父级的子级集吗?我想避免在删除孩子时必须使用parentRepository。我发现实现所有这些目标的唯一不自然的方法是从父集中删除我的孩子并保存父。那么,如果在父级中更新Set并保存父级足以满足所有要求,那么ChildRepository的意义何在?

0 个答案:

没有答案