【问题标题】:Hibernate - renaming objects with a unique constraintHibernate - 使用唯一约束重命名对象
【发布时间】:2009-08-25 11:39:23
【问题描述】:

假设您有一堆带有“title”属性的 Article 对象。然后是一个带有 TITLE 列的 ARTICLE 表。 TITLE 列具有唯一约束。

用户界面在一页上显示所有文章,并带有一个用于编辑标题的文本字段。

假设您有两篇文章 X 和 Y,X 的标题为“1”,Y 的标题为“2”。在页面中,将 Y 重命名为“2”,将 X 重命名为“1”,然后提交表单。将表单中的值直接复制到休眠对象并保存后,将发生 ConstraintViolationException。

如果您从集合中删除“1”篇文章,然后添加另一篇标题为“1”的文章并保存集合,也会发生这种情况。

那么处理这个 Hibernate 怪癖的最佳方法是什么?我觉得我应该重新排列 UI 或其他东西。在保存休眠对象之前手动检查这些条件似乎有点麻烦。

【问题讨论】:

    标签: hibernate unique rename constraints


    【解决方案1】:

    尽管我之前的回答是,但我确认置换两个持久实体的唯一字段会产生一个违反约束的错误即使你一次性完成

    因此,我想说解决此问题的最简单方法是不允许 任何 更改会暗示字段违反唯一约束,即使最终结果有效。这在 UI 层中的编码应该相当简单。

    为什么?

    似乎至少 MySQL 受到此限制,正如我发现的 here,显然没有一种简单的方法可以在不严重影响性能的情况下解决此问题。

    所以人们会认为这个问题可以很容易地以编程方式解决。这很糟糕,是的,但是应该可以编写一些简单的代码来检查您的更新是否会排列两个现有的唯一字段,并分两步完成。

    不过,它会变得多毛。想象一下置换 3 个实例而不是 2 个。例如,“A”、“B”、“C”变为“B”、“C”、“A”。三步?接下来呢?

    【讨论】:

      【解决方案2】:

      我的猜测是您尝试一次更新每个实例,因此实际上会碰撞独特的属性。

      查看Session 对象是否在每个查询之间被关闭或刷新。在这种情况下,您必须在关闭/刷新之前更改这两个实例。

      编辑:确保您阅读了我发布的下一个答案。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2011-05-31
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-29
        • 2016-06-16
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多