繁体   English   中英

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

[英]Hibernate: Check foreign key constraint violation before delete?

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

基本上,我试图做的是确定对象的密钥当前是否存在于另一个表中。 如果不是,我只会调用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是否存在,但是在具有许多关系的表中这将是非常繁琐且容易出错的。 如果可能,我想利用数据库中已有的约束。

具体说到:

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

和:

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

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

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

更新:

当你写:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM