我试图通过其中一个外键级联删除连接表中的行,并且它有另一个与之相关的表,我想删除与此ID关联的所有行。所以它看起来像下图。当我使用带有hibernate的Session.delete(reqCandObject)时,它可以正常工作,并通过删除candidate_jobReq表中的One条目以及相关的注释来实现级联。但是,我想删除具有特定候选ID的candidate_jobReq条目的所有(并且还删除注释)我尝试了下面的函数,但不同于漂亮的hibernate.delete(对象)函数,这个遇到外键约束错误。如何在为hibernate级联删除时删除这些行?
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();
}
}
答案 0 :(得分:4)
Hibernate在内部处理级联。执行delete
查询不会触发内部级联,这将导致不一致/孤立。您可能已尝试并遇到外键约束错误。
有两种方法可以删除实体列表及其子实体:
selectionCase
选择实体列表。遍历列表并使用session.delete
单独删除每个。delete
语句。为避免违反外键约束,您需要在删除父项之前删除子记录。这将比第一个选项表现更好。