【问题标题】:Spring JPA handle unique constraint violation [duplicate]Spring JPA处理唯一约束冲突[重复]
【发布时间】:2021-05-25 12:02:34
【问题描述】:

我有一个实体,比如说Employee

@Entity
public class Employee {
    @Id
    private Long id;
    private String name;
    ....
}

name 字段被标记为唯一。

为了保存 Employee 的列表,我使用了 JpaRepositorysaveAll() 函数。当数据库中存在具有nameEmployee 时出现问题,这意味着违反了唯一约束(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


【解决方案1】:

你可以使用 unique = true。

@Entity
public class Employee {
    @Id
    private Long id;

    @Column(nullable = false, unique = true)
    private String name;
    ....
}

【讨论】:

  • 不管用,还是抛出同样的异常
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多