在Hibernate中“删除Where”级联删除?

时间:2013-10-04 16:04:18

标签: java hibernate foreign-key-relationship cascade cascading-deletes

我试图通过其中一个外键级联删除连接表中的行,并且它有另一个与之相关的表,我想删除与此ID关联的所有行。所以它看起来像下图。当我使用带有hibernate的Session.delete(reqCandObject)时,它可以正常工作,并通过删除candidate_jobReq表中的One条目以及相关的注释来实现级联。但是,我想删除具有特定候选ID的candidate_jobReq条目的所有(并且还删除注释)我尝试了下面的函数,但不同于漂亮的hibernate.delete(对象)函数,这个遇到外键约束错误。如何在为hibernate级联删除时删除这些行?

enter image description here

public void deleteWhere(String selectionCase){
    Session hibernateSession = this.getSession();
    try {
        hibernateSession.beginTransaction();
        Query q = hibernateSession.createQuery("delete "+ type.getSimpleName() +" where " + selectionCase);
        q.executeUpdate();
        hibernateSession.getTransaction().commit();
    } finally {
        hibernateSession.close();
    }
}

1 个答案:

答案 0 :(得分:4)

Hibernate在内部处理级联。执行delete查询不会触发内部级联,这将导致不一致/孤立。您可能已尝试并遇到外键约束错误。

有两种方法可以删除实体列表及其子实体:

  1. 使用selectionCase选择实体列表。遍历列表并使用session.delete单独删除每个。
  2. 手动删除记录。编写单独的delete语句。为避免违反外键约束,您需要在删除父项之前删除子记录。这将比第一个选项表现更好。