Hibernate:如何确保父项的所有子实体都不被删除?

我正在删除entities ,因此从我的数据库中删除行。

确实想要删除某个实体及其所有child行。 但是,我不想从其Parent删除任何行。

我怎么能做到这一点?

KennelParent EntityDog是我要删除的实体。

请参阅下面的代码,了解我如何在Kennel实体中链接2:

 @OneToMany(cascade = CascadeType.MERGE, orphanRemoval = false) @JoinColumn(name = "KENNEL_ID", referencedColumnName = "ID", updatable = true, insertable = true) private Set dogs; 

目前,当我删除狗权利时,其相关的Kennel实体也将被删除。

编辑:狗到狗窝的映射:

 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "KENNEL_ID") private kennel kennel; 

目前,当我删除狗权利时,其相关的Kennel实体也将被删除。

原因是你在ManyToOne注释上设置了cascade=CascadeType.ALL 。 有了这个,我们告诉ORM,当我们删除(或任何其他操作) Dog它也应该将相同的操作传播到Kennel实体。

 Remove cascade attribute in ManyToOne(cascade = CascadeType.ALL ). 

我可以保持狗窝中显示的@oneToMany关系相同吗?

您可能想要考虑的变化很少。

  • 无需在oneToManyManyTone方面使用JoinColumn注释。
  • 考虑在OneToMany注释中使用mappedBy="kennel"属性,并在OneToMany端删除JoinColum注释。 这使得ManyToOne成为拥有者,并且在持久化kennel实体时生成的SQL也更有效。 您可以通过启用show_sql检查。
  • 关于OneToMany上的cascade属性是将其设置为ALL还是MERGEPERSIST, MERGE取决于您要传播到子实体的父实体上的哪些操作。
  • 不确定您是否已经实现了脚手架代码/方法来添加/更新oneToMany关系。 如果不是,那么实现它们是个好主意,因为这可以确保关联在两端都得到更新。 如果需要,请参阅脚手架代码 。

根据需要将CascadeType.ALL操作从子表切换到父表。

这是一个与您几乎相似的简单解决方案,并根据您的需要进行定制。

 @Entity(name = "Kennel") @Table(name = "Kennel") public class Kennel { @Id @Column(name = "Kennel_Id") private long kennelId; @Column(name = "Kennel_name") private String KennelName; //cascade = {CascadeType.REMOVE} OR orphanRemoval = true @OneToMany(cascade = {CascadeType.ALL},orphanRemoval = true,fetch = fetchType.LAZY,mappedBy="dogKennel") private Set dogSet; public long getKennelId() { return kennelId; } public void setKennelId(long kennelId) { this.kennelId = kennelId; } public String getKennelName() { return KennelName; } public void setKennelName(String kennelName) { KennelName = kennelName; } public Set getDogSet() { return dogSet; } public void setDogSet(Set dogSet) { this.dogSet = dogSet; } } @Entity(name = "Dog") @Table(name = "Dog") public class Dog { @Id @Column(name = "Dog_Id") private int dogId; @ManyToOne @JoinColumn(name = "Dog_Kennel_Id",referencedColumnName = "Kennel_Id") private Kennel dogKennel; @Column(name = "Dog_Name") private String dogName; public int getDogId() { return dogId; } public void setDogId(int dogId) { this.dogId = dogId; } public Kennel getDogKennel() { return dogKennel; } public void setDogKennel(Kennel dogKennel) { this.dogKennel = dogKennel; } public String getDogName() { return dogName; } public void setDogName(String dogName) { this.dogName = dogName; } } //adding kennel=1 and dog=1 Kennel ken=new Kennel(); ken.setKennelId(1); ken.setKennelName("KennelExample1"); HashSet myDogSet=new HashSet(); Dog dog=new Dog(); dog.setDogId(1); dog.setDogName("ExampleDog1"); dog.setDogKennel(ken); myDogSet.add(dog); ken.setDogSet(myDogSet); kennelRepo.save(ken); //adding dog=2 under kennel=1 Dog dog2=new Dog(); dog2.setDogId(2); dog2.setDogName("ExampleDog2"); Kennel dog2ken=new Kennel(); dog2ken.setKennelId(1); dog2.setDogKennel(dog2ken); dogRepo.save(dog2); //adding dog=3 under kennel=1 Dog dog3=new Dog(); dog3.setDogId(3); dog3.setDogName("ExampleDog3"); Kennel dog3ken=new Kennel(); dog3ken.setKennelId(1); dog3.setDogKennel(dog3ken); dogRepo.save(dog3); //deleting dog=3 dog3=new Dog(); dog3.setDogId(3); dogRepo.delete(dog3); //deleting kennel=1 which in turn delete all dogs under Kennel k=kennelRepo.findByKennelId(1); kennelRepo.delete(k);