【问题标题】:"Delete Where" cascade delete in Hibernate?Hibernate中的“Delete Where”级联删除?
【发布时间】:2013-10-11 17:19:02
【问题描述】:

我正在尝试通过其中一个外键级联删除连接表中的行,并且它有另一个与之相关的表,我也想删除与此 ID 关联的所有行。所以它看起来像下面的图表。当我将 Session.delete(reqCandObject) 与休眠一起使用时,它可以正常工作并通过从 Candidate_jobReq 表中删除 One 条目以及关联的 cmets 进行级联。但是,我想删除 all 具有特定候选 ID 的 Candidate_jobReq 条目(并删除 cmets)我尝试了下面的函数,但与好的 hibernate.delete(object) 函数不同,这个函数遇到外键约束错误。如何在休眠级联删除的同时删除这些行?

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();
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我希望有一个很好的内置方法来快速处理这种情况,我猜不是:-/哦,好吧。感谢您的信息!
    • 他们真的应该改善这种行为!
    猜你喜欢
    • 2011-08-25
    • 2012-08-16
    • 2014-11-16
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多