You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中遭遇唯一约束重复错误问题排查

问题分析与解决方案

核心原因

你在EmployeeEntity中用了@OneToOne注解关联职位、国家、州,但@OneToOne的语义是一对一绑定——Hibernate会默认给这类关联的外键字段添加唯一约束,确保每个职位/国家/州只能被一个员工关联。但实际业务中多个员工必然会共享同一职位、国家或州,这就导致第二次插入时触发唯一约束报错。

修复步骤

1. 修正实体类的关联注解

把@OneToOne改为@ManyToOne(多对一,符合多个员工对应一个基础数据的业务逻辑),同时修正@JoinColumn的字段名,和数据库表保持一致:

// EmployeeEntity.java 修改后的关联字段
@Entity
@Table(name = "tbl_employee")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "employeeId")
public class EmployeeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long employeeId;

    // 多对一关联职位
    @ManyToOne
    @JoinColumn(name = "designation_id")
    private Designation designationInfo;

    // 多对一关联国家
    @ManyToOne
    @JoinColumn(name = "country_id")
    private Country country;

    // 多对一关联州
    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;

    // 其他字段...
}

2. 删除数据库中的唯一约束

执行以下SQL移除自动生成的三个唯一键:

ALTER TABLE tbl_employee DROP INDEX UK_ku8jubtc7x8evqgglfhafudl4;
ALTER TABLE tbl_employee DROP INDEX UK_2d8ftabh5yvknmnufwqllhyi0;
ALTER TABLE tbl_employee DROP INDEX UK_nj8cpqu4dp6qqiix9g8xd4qj2;

3. 调整级联操作(重要)

原代码中cascade = CascadeType.ALL会导致删除员工时连带删除关联的国家/职位/州(基础字典数据),这完全不符合业务逻辑,建议直接移除cascade配置,或者根据需求选择合适的级联类型(比如CascadeType.MERGE):

// 示例:仅保留必要的级联操作
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "designation_id")
private Designation designationInfo;

额外注意

实体类中@JsonIdentityInfo的property参数要对应实际的主键字段(原代码写的是id,但你的主键是employeeId,这里也需要修正,避免序列化问题)。

内容的提问来源于stack exchange,提问作者androholic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:17:03