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

我应该让JPA还是数据库级联删除?

钱和安
2023-03-14
问题内容

假设我们有两个实体,A和B。B与A具有多对一关系,如下所示:

@Entity
public class A {
  @OneToMany(mappedBy="a_id")
  private List<B> children;
}

@Entity
public class B {
  private String data;
}

现在,我要删除A对象,并将删除操作级联到其所有子项B。有两种方法可以做到这一点:

  1. 添加cascade=CascadeType.ALL, orphanRemoval=true到OneToMany批注中,让JPA删除所有子项,然后再从数据库中删除A对象。

  2. 保持类不变,只需让数据库级联删除操作即可。

使用后面的选项有什么问题吗?这会导致实体管理器保留对已删除对象的引用吗?我之所以选择选项2而不是选项1的原因是,选项1生成了n +
1条用于删除的SQL查询,当对象A包含许多子项时,这可能花费较长的时间,而选项2仅生成一个SQL查询,然后继续进行操作。快乐地。对此是否有“最佳实践”?


问题答案:

如果使用@CascadeOnDelete批注,则在EclipseLink中可以同时使用两者。EclipseLink还将为您生成级联DDL。

参见
http://wiki.eclipse.org/EclipseLink/Examples/JPA/DeleteCascade

这可以通过让数据库进行删除来优化删除操作,还可以通过删除对象来维护缓存和持久性单元。

请注意,这orphanRemoval=true还将删除从集合中删除的对象,数据库级联约束不会为您提供这些对象,因此仍然有必要在JPA中使用规则。数据库还存在一些无法处理删除的关系,因为数据库只能在约束的相反方向上级联,OneToOne带有外键的a或OneToMany带有联接表的a不能在数据库上级联。



 类似资料:
  • 嗨,我遇到这样的情况: 带有2个字段的实体标记,其中包含2组对象(Obj1、Obj2)。删除Obj1时,我想删除标记实体中设置的Obj1中包含的所有信息。你能告诉我怎么做吗? 检查点中没有对标记的引用。若我将Cascade设置为ManyToMany,那个么当我删除标记时,所有带有该标记的用户都会被删除。我想要的是在删除检查点时删除tag\u检查点表中的行。我应该自己做还是有好办法??

  • 在数据库中,将有一个列,并对的列具有外键约束。 对于在删除时级联的外键约束,可能执行的一些操作包括、和。这给出了以下方案组合。 a:在JPA中对父级进行级联删除调用,在删除父行时删除数据库中的子级。 b:在JPA中级联删除,在父删除时将子表中的外键列设置为null。在这种情况下,@joincolumn中的和中的可能需要为true/false。 C:在JPA中进行级联删除,在数据库中对外键删除不做任

  • 我想知道我应该怎么做,因为我读了很多文章试图理解这一点,包括很多问题。我读过的书中,没有一本是非常中肯的。 我想知道当使用级联规则以及应用程序定义数据库时会发生什么,因为这将定义我应该采用以下方法还是其他方法。 如果我现在对对象调用删除操作(无论是通过还是),会发生以下哪种情况? > hibernate操作将删除已加载到会话缓存中的所有相应条记录(可能是也可能不是实际数据库中存在的所有条记录),然

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 问题内容: 性能是关键:在数据库内部级联删除/更新还是让Hibernate / JPA处理它更好? 如果级联在DBMS内部,这会影响查询数据的能力吗? 如果这很重要,我正在使用HSQLDB。 问题答案: 对于级联更新,如果您在数据库中具有外键约束,则根本无法在应用程序空间中执行此操作。 示例:假设您有一个针对美国各州的查找表,主键为两个字母的缩写。然后,您有了一个表,用于引用该表的邮寄地址。有人告

  • 问题内容: 我有一个当前正在使用的Web应用程序,该应用程序将MySQL数据库用作后端,在继续进行下去之前,我需要了解哪种情况更适合我的情况。 简而言之,在此应用程序中,用户将能够使用任何数字字段(由他们决定)构造自己的表单,现在我将其全部存储在由外键链接的几个表中。我的一个朋友建议为了使事情“轻松/快速”,我应该将每个用户的表单转换为一个平面表,以便从他们那里查询数据保持快速(以防万一)。 我应