0

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

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

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

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

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

4

2 回答 2

0

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

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

为什么?

似乎至少 MySQL 受到这个限制,正如我在这里发现的那样,显然没有一种简单的方法可以解决这个问题而不会造成严重的性能损失。

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

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

于 2009-08-25T19:57:29.467 回答
0

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

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

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

于 2009-08-25T19:13:21.100 回答