Hibernate:在删除之前检查外键约束违规?

时间:2012-02-28 00:32:44

标签: java spring hibernate foreign-keys constraints

我目前正在处理的系统有一个策略,其中没有关系的对象可以自由删除,而那些必须在逻辑上删除的对象。这是为了防止删除历史信息。

所以基本上,我试图做的是确定对象的密钥当前是否存在于另一个表中。如果不是,我只会调用delete(),否则我会设置一个指示逻辑删除的属性,并调用update()。

我正在使用Spring事务管理,所以我试图尽可能地混淆会话本身。我最初的方法似乎首先起作用,但你会发现它有一个重大缺陷:

@Transactional
public void deleteObject(SomeEntity object)
{       
    //try to delete
    this.someEntityDAO.delete(object);

    try //force foreign key constraint check
    {
        this.someEntityDAO.flush();
    }
    catch (ConstraintViolationException e)
    {
        //reload object
        object= this.someEntityDAO.loadById(object.getId());

        //save as inactive instead of deleting
        object.setActive(false);
        this.someEntityDAO.update(object);
    }
}

由于Hibernate异常是致命的,因此这是完全不可靠的(即使它有效)。我想知道是否有办法进行某种“偷看”操作,我可以测试删除是否会因约束而失败,而不会实际执行操作(从而使会话无效)。我唯一能想到的是手动检查每个相关的表以查看id是否存在,但是在具有许多关系的表中这将是非常繁琐且容易出错的。如果可能,我想利用数据库中已有的约束。

1 个答案:

答案 0 :(得分:0)

专门针对:

  

所以基本上,我试图做的是确定对象的密钥当前是否存在于另一个表中。如果不是,我只会调用delete(),否则我会设置一个指示逻辑删除的属性,并调用update()。

  

我想知道是否有办法进行某种“偷看”操作,我可以测试删除是否会因约束而失败,而不会实际执行操作(从而使会话无效)。

我偶尔只使用Hibernate,但一般的答案是:这就是SQL的用途。一切都在你的where子句中!

为清楚起见:您使用足够的where子句进行删除,以便在事务本身中进行检查;删除删除符合给定约束的任何内容。

<强>更新

当你写:

  

“所以基本上,我试图做的是确定一个对象的密钥当前是否存在于另一个表中。如果不是,我只是调用delete(),否则我会设置一个指示逻辑删除的属性,并调用update()。“

问题在于,当您应该让(直接)数据库引擎在SQL中为您执行此操作时,您正在尝试执行此操作。调查使用“不存在”条款......