我目前正在处理的系统有一个策略,其中没有关系的对象可以自由删除,而那些必须在逻辑上删除的对象。这是为了防止删除历史信息。
所以基本上,我试图做的是确定对象的密钥当前是否存在于另一个表中。如果不是,我只会调用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是否存在,但是在具有许多关系的表中这将是非常繁琐且容易出错的。如果可能,我想利用数据库中已有的约束。
答案 0 :(得分:0)
专门针对:
所以基本上,我试图做的是确定对象的密钥当前是否存在于另一个表中。如果不是,我只会调用delete(),否则我会设置一个指示逻辑删除的属性,并调用update()。
和
我想知道是否有办法进行某种“偷看”操作,我可以测试删除是否会因约束而失败,而不会实际执行操作(从而使会话无效)。
我偶尔只使用Hibernate,但一般的答案是:这就是SQL的用途。一切都在你的where子句中!
为清楚起见:您使用足够的where子句进行删除,以便在事务本身中进行检查;删除删除符合给定约束的任何内容。
<强>更新强>
当你写:
“所以基本上,我试图做的是确定一个对象的密钥当前是否存在于另一个表中。如果不是,我只是调用delete(),否则我会设置一个指示逻辑删除的属性,并调用update()。“
问题在于,当您应该让(直接)数据库引擎在SQL中为您执行此操作时,您正在尝试执行此操作。调查使用“不存在”条款......