一尘不染

休眠:如何确保在父级的所有子实体都删除后不删除父级?

hibernate

我要删除entities,因此要从数据库中删除行。

确实 要删除某个实体及其所有child行。不过,我 希望从它删除任何行Parent

如何 我能做到这一点?

Kennel是,Parent Entity并且Dog是我要删除的实体。

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

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

目前,当我删除狗entitie(S),其相关的养犬实体 也被删除。

编辑:将狗映射到狗窝:

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

阅读 190

收藏
2020-06-20

共1个答案

一尘不染

当前,当我删除狗实体时,其相关的狗窝实体也将被删除。

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

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

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

您可能需要考虑的更改很少。

  • 无需具有JoinColumn在两个注释oneToManyManyTone侧面。
  • 考虑mappedBy="kennel"OneToMany注释中使用属性,并JoinColumOneToMany侧面删除注释。这使得ManyToOne拥有方,并且在持久化kennel实体时所生成的SQL效率也更高。您可以通过启用自己进行检查show_sql
  • 关于cascade将属性OneToMany设置为ALLMERGEPERSIST, MERGE取决于要传播到子实体的父实体上的操作的属性。
  • 不知道您是否已经实现了脚手架代码/方法来添加/更新oneToMany关系。如果不是,则最好实现它们,因为这样可以确保在两端都更新关联。如果需要,请参考脚手架代码
2020-06-20