Hibernate -更新时违反唯一约束

txu3uszq  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(235)

考虑一下这种情况:我有一个表,它有两个列IDPRIORITYPRIORITY列有唯一的约束。
该表的示例数据为:

| ID     | PRIORITY |
| -------| ---------|
| 1001   | 1        |
| 1002   | 2        |
| 1003   | 3        |

字符串
应用程序具有更改条目的PRIORITY的功能。假设我想替换10031002的优先级。这样做,我试图用新的PRIORITY值更新两个实体:1)ID: 1002, PRIORITY: 3 2)ID: 1003, PRIORITY: 2
我使用Hibernate的session方法逐个循环执行:session.saveOrUpdate(object);org.hibernate:hibernate-core:5.6.5
但很明显,在第一次更新尝试时,它会返回违反约束的错误。
如何管理这种情况?有没有任何类型的“批量更新”可用于这种情况?

编辑:

下面的示例代码说明了这种情况:

import jakarta.persistence.*;

@Entity
public class ExampleTable
{
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  private Integer priority;

  public ExampleTable(Long id, Integer priority)
  {
    this.id = id;
    this.priority = priority;
  }

  public ExampleTable()
  {
  }
  // getters & setters
}
import org.example.domain.*;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    ExampleTable et1 = new ExampleTable(1002L, 3);
    ExampleTable et2 = new ExampleTable(1003L, 2);
    List<ExampleTable> list = Arrays.asList(et1, et2);

    Session session = new Configuration().configure().buildSessionFactory().openSession();
    session.beginTransaction();

    for (ExampleTable et : list)
    {
      session.saveOrUpdate(et);
    }

    session.getTransaction().commit();
  }
}

的数据
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.1.0:java (default-cli) on project hibernate-unique-constraint: An exception occurred while executing the Java class. could not execute statement [Duplicate entry '3' for key 'ExampleTable.ExampleTable_pk'] [update ExampleTable set priority=? where id=?]

pgvzfuti

pgvzfuti1#

这是一个比Hibernate更普遍的问题。如果你想更新这些唯一值,你首先需要将它们更改为不同的值(任何类型的临时值都可以),然后运行更新。
当然,即使是临时值也需要是唯一的。您需要开发一个方案来确保不违反约束,同时仍然更新为法律的临时值。

相关问题