当前位置: 首页 > 面试题库 >

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

哈烨熠
2023-03-14
问题内容

我要删除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;

问题答案:

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

原因是您已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关系。如果不是,则最好实现它们,因为这样可以确保在两端都更新关联。如果需要,请参考脚手架代码。


 类似资料:
  • 删除父实体时,我还想删除关联的子实体(从数据库中)。我试图在删除时使用级联,如下所示,但我一定做错了什么。 当对父实体对象调用删除时,我收到错误消息:“该实体仍在数据库的其他地方引用”。我可以确认该实体在数据库的其他地方引用的唯一地方是在下面的两个表中(如果我手动从数据库中删除子行,对父实体对象的删除调用工作正常)。在过去的9个小时里,我一直在阅读实体对象并尝试不同的东西。我做错了什么? 这是我的

  • 我有一些关于“级联”的问题,在我的项目中,我有类别类,每个类可以是父类或子类。但我在同一个类中定义了哪一个是父母还是孩子。父母和孩子之间存在一对多的关系。这是我的实体类 我的问题是;当我删除子类别时,它的成功并没有问题。如果父类别有子类别,则无法删除父类别。 错误消息; Servlet.service()的servlet[调度Servlet]在上下文中与路径[]抛出异常[请求处理失败;嵌套异常or

  • 我用的是SpringBoot和JPA Hibernate。 我有这些实体: 当我尝试删除父实体(Post)时,所有相关实体注释都保留在数据库中。为什么级联删除不起作用?

  • 我的实体。ValidationStep与documentDetail有一对一的关系,documentDetail与documentValidations有一个完全的关系 我的删除查询 父ValidationStep被删除,但是docDetail和documentValidations仍然在数据库中。

  • 我有两个实体使用Spring和Hibernate

  • 问题内容: 在Hibernate中删除表中所有行 的最佳方法是什么? 如果我遍历一个集合并称其在我所知范围内没有执行。 如果使用其他选项,则不会影响持久性上下文。 如果没有更好的选择,何时应该使用这些方法? 问题答案: 如果没有什么要层叠的,请使用HQL删除 如果您有层叠,请迭代该集合并分别删除每个集合。 问题出在以下事实:休眠在内部处理级联,而不是将其留给数据库。因此,发送查询不会触发内部级联,