我有一个具有唯一字段的实体 A,该字段基本上定义了该实体,这意味着它是相等的,那么实体也完全相同。
第二点是,如果违反该约束,那么绝不是例外。这意味着完全可以预期用户会尝试输入重复项。
如果出现重复,应用程序应该默默地选择已经存在的实体。我现在的问题是我应该做什么,特别是在保存包含 As 列表的实体时。
我不确定这是否容易实现,因为 DataIntegrityViolationException 不包含任何易于处理的信息,例如在级联持续存在的情况下受影响的实体!
- 保存前检查(持久化)并将提交的实体替换为现有实体(具有 id 集)
我更喜欢这个,但是有相当大的开销,因为在每个插入之前可能有多个选择(存在性检查)。
更好的方法是什么?
对于选项1)你正在寻找类似的东西http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html但该命令在 JPA/hibernate 级别没有任何等效项(我不认为这是 ANSI SQL)。尝试捕获异常并“从那里开始”是一个坏主意,因为事务将被回滚,并且您将必须经历许多问题才能使其按照您想要的方式运行。
对于选项 2),我认为这是标准的 JPA/hibernate 实践,您不仅需要查询并可能从数据库加载实体,还需要将更改从瞬态对象复制到加载的对象,然后让 JPA 保存你的更新。这是相当麻烦的,您必须小心您所依赖的任何级联操作,因为您可能需要避免用瞬态对象覆盖持久对象。这是一个复杂的问题,JPA/Hibernate 没有很好的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)