当前位置: 首页 > 知识库问答 >
问题:

JPA删除所有实体作品奇怪

巫马自明
2023-03-14

我有这样一种实体关系:

在ParentObj类中:

@OneToMany(mappedBy = "parentObj", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
private List<ChildObj> list;

在ChildObj类中:

@JoinColumn(name="PARENT_OBJ")
@ManyToOne
private ParentObj parentObj;

当父对象持久化或删除时,子对象也被持久化/删除。但是当我尝试使用CriteriaDelete删除所有实体时,例如:

CriteriaDelete<ParentObj> query = builder.createCriteriaDelete(ParentObj.class);
            query.from(ParentObj.class);
            em.createQuery(query).executeUpdate();

或者像这样的简单查询:

em.createQuery("DELETE FROM ParentObj po").executeUpdate();

我遇到了一个ConstraintViolationException,有人能解释一下为什么会发生这种情况吗?

我在Wildfly服务器上使用org.hibernate.ejb.带有JTA的Hibernate持久性提供程序。

共有1个答案

须景辉
2023-03-14

以下内容

em.createQuery("DELETE FROM ParentObj po").executeUpdate(); 

是一个JPQL批量更新命令,如JPQL语言参考所述:

10.2.9. JPQL批量更新和删除

操作批量更新和删除操作适用于单个实体类(及其子类(如果有)的实体。

删除操作仅适用于指定类及其子类的实体。它不会级联到相关实体。。。。。

https://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_bulk_ops

因此,本质上,您正在尝试删除一个实体,由于缺乏级联,该实体在数据库中仍然具有FK引用。因此出现了例外。

CriteriaDelete也有类似的限制:

https://docs.oracle.com/javaee/7/api/javax/persistence/criteria/CriteriaDelete.html

标准API批量删除操作直接映射到数据库删除操作。持久性上下文与批量删除的结果不同步。

 类似资料:
  • 主要内容:JPA实体删除示例要从数据库中删除记录,可以使用接口提供方法。方法使用主键来删除特定的记录。 JPA实体删除示例 在这里,我们将演示如何根据主键删除指定学生的信息。 完整的项目代码如下所示 - 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,它包含属性:,和。 文件:StudentEntity.java 的代码如下 - 第2步: 将实体类和其他数据库配置映射到文件中。 文件:persistence.

  • 问题内容: 我有以下通常正常工作的代码: 对于我的许多实体类来说,这都是可行的。但是对于其中的两个它什么也不做,它不会引发任何异常,也不会删除该对象。来自hibernate的日志显示,hibernate执行了许多选择查询,但它甚至没有尝试执行删除。 我已经在这里和这里尝试了在其他类似问题中发现的建议,但是没有用(嗯,后者建议我不能使用,但是我只是在和之间加上了语句)。 我似乎找不到这两个类比其他类

  • 我有以下通常运行良好的代码: 对于我的许多实体类,这很有效。但是,对于其中两个,它什么都不做,它不会引发任何异常,也不会删除对象。来自Hibernate的日志显示Hibernate执行了许多选择查询,但它甚至不会尝试执行删除。 我已经尝试了在这里和这里的其他类似问题中找到的建议,但无济于事(好吧,后者建议我不能使用,但我只是将语句括在和之间)。 我似乎找不到这两个班比其他班多(或少)什么。他们使用

  • 在我的Spring/MySql系统中,我有一些Jpa实体,它们通过父关系上的joinTable在OneToMany关系中连接。在这种情况下,一个帖子有很多评论。 如果我尝试删除Post实体,问题是生成的SQL试图删除仍在连接表中的注释,从而触发外键冲突。 什么是正确的方法: 删除连接表项 删除连接表左侧父关系实体 删除连接表右侧子关系实体 要记住的一些事情: 还有其他实体通过oneTo多项关系拥有

  • 我有两个实体,用户和电影。他们是很多双向的关系。我的问题是,当我通过我的控制器删除一部电影时,它也会删除所有与该电影相关的实体。My user和this user角色和movie实体。我要做什么,从表中删除电影实体,并保持用户与他的角色,而不是删除他们所有。

  • 问题内容: 我有两个分别以双向一对多关系存在的实体类 A 和 B。 A.java: B.java 在一个简单的控制台应用程序中,我从数据库中获取了特定的 A 行,并尝试删除其详细信息 B 行(随机),但是 JPA / Hibernate* 不仅删除了该行-甚至没有向该行发出任何 DELETE 语句。数据库。删除 B 行的唯一方法是从 A.java 的集合( LinkedHashSet )中删除相应