想象一个场景:
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.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的意义何在?