2013-03-31 28 views
1

我有一个实体A具有独特的领域,该领域基本上定义的实体处理,这意味着它是相等的,那么则实体也完全一样。JPA(休眠)+春季:具有独特的违反约束

的第二点是,它绝不例外让说如果违反约束。意思是完全预计用户将尝试输入重复。

在重复的情况下,应用程序应该默默的选择了已经存在的实体。我的问题是现在我应该做什么,特别是在保存包含As列表的实体时。

  • 刚刚捕获异常,并从那里去

我不知道这是很容易尽可能DataIntegrityViolationException不成立像什么实体的情况下受到影响的级联坚持任何容易处理的信息!

  • 检查之前保存(坚持),并与现有的更换提交的实体(即有一个ID集)

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

有什么更好的办法?

回答

3

对于选项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没有好的解决方案的复杂问题。

+0

关于1)我可以做同样的检查,作为2)异常发生后。然后,我可以用我们自己的例外情况来详细说明违反了哪个唯一约束条件。我觉得这样比较好?因为检查仅在需要时完成。 –

+0

这可能会工作,但在这种情况下,你没有保存任何东西到数据库的情况下重复的ID,我虽然你想执行更新。 – ilcavero