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

JPA:DELETE WHERE不会删除子项并引发异常

赵英资
2023-03-14
问题内容

MOTHER由于JPQL查询,我试图从中删除大量行。

所述Mother类的定义如下:

@Entity
@Table(name = "MOTHER")
public class Mother implements Serializable {

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "mother", 
               orphanRemoval = true)
    private List<Child> children;    
}

@Entity
@Table(name = "CHILD")
public class Child  implements Serializable {

    @ManyToOne
    @JoinColumn(name = "MOTHER_ID")
    private Mother mother;    
}

如您所见,Mother该类具有“子级”,并且在执行以下查询时:

String deleteQuery = "DELETE FROM MOTHER WHERE some_condition";
entityManager.createQuery(deleteQuery).executeUpdate();

引发异常:

ERROR - ORA-02292: integrity constraint <constraint name> violated - 
                   child record found

当然,我可以先选择要删除的所有对象,然后将它们检索到列表中,然后再遍历它以删除所有检索到的对象,但是这种解决方案的性能简直太糟糕了!

那么,有没有一种方法可以利用先前的映射来有效地删除所有对象以及与它们关联的Mother所有Child对象,而无需先为 所有 子对象编写查询?


问题答案:

删除(和INSERT)不会通过JPQL查询中的关系进行级联。这在规范中显然是拼写的:

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

幸运的是,持久化并通过实体管理器删除(当定义了层叠属性时)。

你可以做什么:

  • 获取所有应删除的母亲实体实例。
  • 对于每个对象,请调用EntityManager.remove()。

代码是这样的:

String selectQuery = "SELECT m FROM Mother m WHERE some_condition";  
List<Mother> mothersToRemove = entityManager
    .createQuery(selectQuery)
    .getResultStream()
    .forEach(em::remove);


 类似资料:
  • 问题内容: 我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间 我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。 当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 当我更改ListViewAdapter时,我的项目将无法从ListView中清除,并且我有一些空白条目。 她是我的密码:

  • 为什么这段代码不抛出?看一看: 我不知道!

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

  • 问题内容: 我在接口抛出异常的地方读了这段代码,但是实现它的类却没有抛出异常或捕获异常,这是为什么呢?在Java中合法或安全吗? 问题答案: 实现和扩展的一般规则是,您可以使新类或接口的限制较少,而不能限制较多。如果您认为将异常作为限制进行处理的要求,则未声明异常的实现的限制性较小。对该接口进行编码的任何人都不会遇到您的课的麻烦。 -斯坦·詹姆斯 作为http://www.coderanch.co