Spring Boot 3.1.x中JPA自动生成CreatedBy/LastModifiedBy唯一约束问题
解决Spring Boot 3.1.x中@CreatedBy/@LastModifiedBy关联字段自动生成唯一约束的问题
问题原因
Spring Boot 3.x对应的Spring Data JPA版本调整了关联注解与审计注解结合时的约束生成逻辑。@OneToOne注解本身语义上要求关联字段唯一,3.x版本严格遵循这一语义自动生成唯一约束;而2.x版本可能存在逻辑疏漏,未强制生成该约束。此外从业务逻辑来看,created_by和updated_by字段使用@OneToOne并不合理——多个实体理应允许被同一个用户创建/更新,正确的关联关系应为@ManyToOne。
解决方案
方案1:修正关联关系为@ManyToOne(推荐)
将@OneToOne替换为@ManyToOne,既符合业务逻辑,也能避免不必要的唯一约束生成:
@JsonIgnore @CreatedBy @ManyToOne @JoinColumn(name = "created_by", nullable = true) var createdBy: User? = null @JsonIgnore @LastModifiedBy @ManyToOne @JoinColumn(name = "updated_by", nullable = true) var updatedBy: User? = null
方案2:显式禁用唯一约束(不推荐)
若因特殊需求必须保留@OneToOne,可通过@JoinColumn的unique=false属性显式关闭唯一约束生成:
@JsonIgnore @CreatedBy @OneToOne @JoinColumn(name = "created_by", nullable = true, unique = false) var createdBy: User? = null @JsonIgnore @LastModifiedBy @OneToOne @JoinColumn(name = "updated_by", nullable = true, unique = false) var updatedBy: User? = null
注意:此方案违背
@OneToOne的语义规范,可能导致数据关联逻辑混乱,仅建议在特殊场景下临时使用。
内容的提问来源于stack exchange,提问作者Ret Ret
相关产品推荐
相关产品推荐

