考虑一下这种情况:我有一个表,它有两个列ID
和PRIORITY
。PRIORITY
列有唯一的约束。
该表的示例数据为:
| ID | PRIORITY |
| -------| ---------|
| 1001 | 1 |
| 1002 | 2 |
| 1003 | 3 |
字符串
应用程序具有更改条目的PRIORITY
的功能。假设我想替换1003
和1002
的优先级。这样做,我试图用新的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=?]
个
1条答案
按热度按时间pgvzfuti1#
这是一个比Hibernate更普遍的问题。如果你想更新这些唯一值,你首先需要将它们更改为不同的值(任何类型的临时值都可以),然后运行更新。
当然,即使是临时值也需要是唯一的。您需要开发一个方案来确保不违反约束,同时仍然更新为法律的临时值。