【问题标题】:JPA (Hibernate) + Spring: Dealing with unique constraint violationsJPA (Hibernate) + Spring:处理违反唯一约束
【发布时间】:2013-03-31 15:55:47
【问题描述】:

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

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

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

  • 只需捕获异常并从那里开始

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

  • 保存前检查(保留)并将提交的实体替换为现有实体(已设置 id)

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

什么是更好的方法?

【问题讨论】:

    标签: hibernate jpa unique-constraint


    【解决方案1】:

    对于选项 1)您正在寻找类似 @​​987654321@ 的东西,但在 JPA/hibernate 级别上没有与该命令等效的东西(我认为这不是 ANSI SQL)。试图捕获异常并“从那里开始”是一个坏主意,因为事务将被回滚,并且您必须经历许多问题才能使其表现得如您所愿。

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

    【讨论】:

    • 关于 1) 我可以在异常发生后进行与 2) 完全相同的检查。然后,我可以抛出我自己的异常,详细说明违反了哪个唯一约束。我觉得这样更好?因为只有在需要时才会进行检查。
    • 这可能有效,但在这种情况下,如果 ID 重复,您不会将任何内容保存到数据库中,我虽然您想执行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2020-05-28
    相关资源
    最近更新 更多