0

我正在尝试更新 Java 实体的集合,但 Hibernate 执行批量更新的顺序会导致约束冲突异常。我将使用下面的例子来解释这种情况。

实体 Student Int id String Name String deskID

规则:2名学生不能有同一张桌子

第一次交易:插入 2 名学生如下 Student 1 Id:1 Name:ABC DeskId:D1

学生 2 ID:2 姓名:DEF DeskId:D2

现在,在此之后,我决定更新两个学生实体以交换他们的课桌,并将一组更新的学生实体发送到休眠更新学生 1 ID:1 名称:ABC DeskId:D2

学生 2 ID:2 姓名:DEF DeskId:D1

但这会导致违反约束异常,因为我认为更新一次只发生一条记录。

我正在使用 JTA 实体管理器来管理事务。我要更新的代码看起来像这样

updateMultiple(Collection<Student> updatedStudents)
        for (final Student student: updatedStudents)
        {
            final Student st= this.entityManager.getReference(Student.class, Student.getId());
            student.merge(st);
        }
        this.entityManager.flush();
        return breakClauseDtos;
4

1 回答 1

1

您的问题的根源很明确:数据库在执行 SQL 语句而不是在提交时检查约束。执行第一条 SQL 语句时,违反了约束。

您可以先从学生 1 那里移开课桌,然后将其分配给学生 2,然后再将其描述给学生 1,这样您就可以解决这个问题。这意味着三个 SQL 语句(超过必要的一个),然后您可能必须在每次更新后刷新会话(Hibernate 重新排序 SQL 语句,这可能会干扰您的手动排序)。

但更好的解决方案是纠正数据模型中的问题。

如果每张课桌只能由一个学生拥有,则课桌与学生之间存在:1 关系。Desk 需要学生的 id 作为外键。不需要定义额外的约束。现在换课桌就是换课桌记录里的学生证。这可以通过两个更新语句来完成。

于 2012-10-02T12:08:01.233 回答