【发布时间】:2021-05-25 12:02:34
【问题描述】:
我有一个实体,比如说Employee
@Entity
public class Employee {
@Id
private Long id;
private String name;
....
}
name 字段被标记为唯一。
为了保存 Employee 的列表,我使用了 JpaRepository 的 saveAll() 函数。当数据库中存在具有name 的Employee 时出现问题,这意味着违反了唯一约束(name)。
我想在这里处理的是我可以忽略或更新这个 Employee 吗?有一个想法是在保存任何 Employee 之前,我必须先检查它,例如 findByName(),但这样做会使工作量翻倍,并且在批量很大时非常不方便。
这是错误日志:
org.springframework.dao.DataIntegrityViolationException: could not execute batch;
SQL......at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccess
Exception(HibernateJpaDialect.java:298)......
Caused by: org.hibernate.exception.ConstraintViolationException: could not execute batch......
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (SILKGATE_TEST.SYS_C00100705) violated.....
在此感谢您
【问题讨论】:
-
我看到@VICTOR 提到了一个副本。但是为什么
name是您主键的一部分,而不仅仅是id,有什么具体原因吗?实际上,您定义它的方式,name不是您实体上任何键的一部分,那么为什么它违反了一些约束?你能分享一个堆栈跟踪吗? -
@Aristotle 因为业务原因,
name必须是唯一的,这是错误日志:org.springframework.dao.DataIntegrityViolationException: could not execute batch; SQL......at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:298)......引起:org.hibernate.exception.ConstraintViolationException:无法执行批处理。 .....引起:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(SILKGATE_TEST.SYS_C00100705)..... -
好的,现在明白你想要什么了。但同样我不认为违规来自
name字段。也许您可以提供整个跟踪,以便我们对其进行分析。 -
我使用下面的查询来创建表: CREATE TABLE EMPLOYEE ( "ID" NUMBER(10) NOT NULL ENABLE, "NAME" VARCHAR2(200 BYTE) NOT NULL ENABLE UNIQUE, "FULL_NAME" VARCHAR2( 200 字节)非空启用唯一,约束“EMPLOYEE_PK”主键(“ID”));如您所见,
name应该是唯一的
标签: java spring jpa spring-data-jpa