JPA(Hibernate)+ Spring:处理唯一约束违规

时间:2013-03-31 15:55:47

标签: hibernate jpa unique-constraint

我有一个具有唯一字段的实体A,该字段基本上定义了实体,意味着它是相等的,然后实体也完全相同。

第二点是,如果违反了这种约束,我们就不会说是例外。这意味着用户将完全期望尝试输入重复项。

如果出现重复,应用程序应默默选择已存在的实体。我现在的问题是,在保存包含As。

列表的实体时,我应该做些什么
  • 抓住异常并从那里开始

我不确定这是否容易实现,因为DataIntegrityViolationException不包含任何易于处理的信息,例如在Cascaded persist的情况下受影响的实体!!!

  • 保存前检查(持久)并将提交的实体替换为现有实体(具有ID设置)

我更喜欢这个,但是有相当大的开销,因为在插入每个插入之前可能有多个选择(存在检查)。

什么是更好的方法?

1 个答案:

答案 0 :(得分:4)

对于选项1)你正在寻找像http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html这样的东西但是在该命令的JPA / hibernate级别没有任何等价物(我不认为这是ANSI SQL)。试图捕获异常并“从那里开始”是一个坏主意,因为事务将被回滚,你将不得不经历许多问题,使其表现得像你想要的那样。

对于选项2),我认为是标准的JPA / hibernate实践,您不仅需要查询并可能从DB加载实体,还要将您的更改从瞬态对象复制到加载的对象,然后让JPA保存您的更新。这是一个非常麻烦的事情,你必须小心你依赖的任何级联操作,因为你可能需要避免用瞬态对象覆盖持久化对象。这是一个复杂的问题,JPA / Hibernate没有很好的解决方案。