Hibernate:在删除之前检查外键约束是否违反?

Jay*_*Pea 5 java spring hibernate constraints foreign-keys

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

所以基本上,我试图做的是确定一个对象的键当前是否存在于另一个表中。如果不是,我将简单地调用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*d T 0

具体来说:

所以基本上,我想做的是确定对象的键当前是否存在于另一个表中。如果不是,我将简单地调用delete(),否则我将设置一个指示逻辑删除的属性,然后调用update()。

和:

我想知道是否有一种方法可以进行某种“查看”操作,在该操作中我可以测试删除是否会由于约束而失败,而无需实际执行操作(从而使会话无效)。

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

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

更新:

当你写:

“所以基本上,我想做的是确定对象的键当前是否存在于另一个表中。如果不是,我将简单地调用delete(),否则我将设置一个指示逻辑删除的属性,然后调用更新()。”

问题是,当您应该让(指导)数据库引擎在 SQL 中为您执行此操作时,您却试图执行此操作。调查“不存在”子句的使用......