我有一个具有唯一字段的实体A,该字段基本上定义了实体,意味着它是相等的,然后实体也完全相同。
第二点是,如果违反了这种约束,我们就不会说是例外。这意味着用户将完全期望尝试输入重复项。
如果出现重复,应用程序应默默选择已存在的实体。我现在的问题是,在保存包含As。
列表的实体时,我应该做些什么我不确定这是否容易实现,因为DataIntegrityViolationException不包含任何易于处理的信息,例如在Cascaded persist的情况下受影响的实体!!!
我更喜欢这个,但是有相当大的开销,因为在插入每个插入之前可能有多个选择(存在检查)。
什么是更好的方法?
答案 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没有很好的解决方案。