Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA(Hibernate)+Spring:处理唯一约束冲突_Hibernate_Jpa_Unique Constraint - Fatal编程技术网

JPA(Hibernate)+Spring:处理唯一约束冲突

JPA(Hibernate)+Spring:处理唯一约束冲突,hibernate,jpa,unique-constraint,Hibernate,Jpa,Unique Constraint,我有一个具有唯一字段的实体a,该字段基本上定义了实体,这意味着它是相等的,那么实体也是完全相同的 第二点是,如果违反了该约束,我们可以毫不例外地说。这意味着用户完全可以尝试输入重复项 如果是重复的,应用程序应该默默地选择已经存在的实体。我现在的问题是我应该做什么,尤其是当保存包含As列表的实体时 只需抓住异常并从那里开始 我不确定这是否容易实现,因为DataIntegrityViolationException不包含任何易于处理的信息,例如在级联持久化的情况下哪个实体受到影响 保存前请选中“持久

我有一个具有唯一字段的实体a,该字段基本上定义了实体,这意味着它是相等的,那么实体也是完全相同的

第二点是,如果违反了该约束,我们可以毫不例外地说。这意味着用户完全可以尝试输入重复项

如果是重复的,应用程序应该默默地选择已经存在的实体。我现在的问题是我应该做什么,尤其是当保存包含As列表的实体时

只需抓住异常并从那里开始 我不确定这是否容易实现,因为DataIntegrityViolationException不包含任何易于处理的信息,例如在级联持久化的情况下哪个实体受到影响

保存前请选中“持久化”,并将提交的实体替换为已设置id的现有实体 我更喜欢这一点,但是会有相当大的开销,因为在每次插入之前,可能会有多个选择存在性检查


更好的方法是什么?

对于选项1,您正在寻找类似的方法,但在JPA/hibernate级别,该命令没有等效的方法,我认为这不是ANSI SQL。试图捕获异常并从那里开始是一个坏主意,因为事务将被回滚,您必须经历许多问题才能使其按您所希望的方式运行


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

对于选项1,您正在寻找类似的东西,但在JPA/Hibernate级别,该命令没有等效的东西,我认为这不是ANSI SQL。试图捕获异常并从那里开始是一个坏主意,因为事务将被回滚,您必须经历许多问题才能使其按您所希望的方式运行


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

在异常发生后,我可以做与2完全相同的检查。然后,我可以使用违反唯一约束的确切细节来创建自己的异常。我觉得这样更好?因为检查只在需要时进行。这可能会起作用,但在这种情况下,如果ID重复,您不会将任何内容保存到数据库中,我认为您希望执行更新。大约1我可以在异常发生后执行与2完全相同的检查。然后,我可以使用违反唯一约束的确切细节来创建自己的异常。我觉得这样更好?因为检查只在需要时进行。这可能会起作用,但在这种情况下,如果ID重复,您不会将任何内容保存到数据库中,我认为您希望执行更新。