java为什么@OnDelete(action=OnDeleteAction.CASCADE)在删除InheritanceType时不删除parenttableentry。加入
参与:
- 爪哇
- JPA/Hibernate
- Spring数据
问题
当使用@Inheritation(strategy=InheritanceType.join)并通过“外部触发器”(又名@OnDelete(action=OnDeleteAction.CASCADE))删除对象时,子表中的条目将被删除,换句话说:ParentTable保留一个“孤立”条目。为什么
我搜索了很多这个话题,但只找到了一个相关的问题(JPA Inheritance - parent is not deleted with child)。这没用
变通办法 (我不想使用,但它会起作用)
- 手动删除子项“独立”/。然后,按照Hibernate文档中的描述删除父表的条目李>
- 更改所属关系,以便VorschRech在OneToOne(cascade=CascadeType.ALL)有一个“正常”的删除cascade
也不起作用的事情:
- 多个而不是一个
所以我对
为什么@OnDelete(action=OnDeleteAction.CASCADE)不能与InheritanceType一起工作。加入
参与课程:
@MappedSuperclass
public class BasisEntity {
@javax.persistence.Id
private final Long id;
public BasisEntity() {
this.id = Long.valueOf(Id.next());
}
[.. more Code goes here]}
“触发”类:
@Entity
public class VorschRech extends BasisEntity {
public VorschRech() {
super();
}
}
继承情况:
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class VerbrParent extends BasisEntity {
private String parentalLyrics;
public VerbrParent() {
super();
}
public String getParentalLyrics() {
return parentalLyrics;
}
public void setParentalLyrics(String parentalLyrics) {
this.parentalLyrics = parentalLyrics;
}
}
只被部分删除的子项:在表verbr_intern yes中,但不是其在verbr_parent中的行:
@Entity
public class VerbrIntern extends VerbrParent {
@OneToOne
@OnDelete(action = OnDeleteAction.CASCADE) //<<-- The TRIGGER
private VorschRech vorschRech;
public VerbrIntern() {
super();
}
public VorschRech getVorschRech() {
return vorschRech;
}
public void setVorschRech(VorschRech vorschRech) {
this.vorschRech = vorschRech;
}
}
另一个随机的孩子:
@Entity
public class VerbrXt extends VerbrParent {
public VerbrXt() {
super();
}
}
回购协议1:
public interface VorschRechRepository
extends JpaRepository<VorschRech, Long>, QuerydslPredicateExecutor<VorschRech> {
}
回购协议2:
public interface VerbrParentRepo
extends JpaRepository<VerbrParent, Long>, QuerydslPredicateExecutor<VerbrParent> {}
创建操作:
VorschRech vrech = new VorschRech(); vorschrechRepo.save(vrech);
VerbrIntern verbrIntern = new VerbrIntern();
verbrIntern.setParentalLyrics("VerbrIntern blah!");
verbrIntern.setVorschRech(vrech);
verbrParentRepo.save(verbrIntern);
删除操作:
vorschrechRepo.deleteAll();
结果
表VORSCHU rech:不再输入
实习医生:不再输入
表verbr_父项:1个不应存在的条目。(也就是创建VerbrIntern-Object时的“剩余部分”。)
共 (0) 个答案