使用ddl-auto=create-drop时JPA生成错误外键的问题排查
问题原因与解决方案
核心问题出在PhoneDto的关联注解错误:
你在PhoneDto中对customer字段使用了@OneToOne注解,而正确的应该是@ManyToOne(和EmailDto保持一致)。
为什么会生成唯一约束?
@OneToOne关联的语义是「一个客户对应一个手机号」,JPA会自动在子表的外键字段(customer_id)上添加唯一约束,确保每个客户只能关联一条手机号记录,这就是你插入第二条时触发duplicate key value violates unique constraint "phone_customer_id_key"错误的原因。
修复步骤
修改PhoneDto中的关联注解:
@Entity @Table(name = "phone") @Data public class PhoneDto { @Id private Long id; @Column(name = "phone_number", nullable = false, length = 32) private String phoneNumber; // 把@OneToOne改成@ManyToOne @ManyToOne(fetch = FetchType.LAZY) private CustomerDto customer; }
修复后效果
修改后,JPA会按照@OneToMany(父实体)和@ManyToOne(子实体)的正确关联关系生成表结构,phone表的customer_id外键不再带有唯一约束,你就可以为同一个客户插入多条手机号记录了。
额外说明
父实体CustomerDto中phones字段的@JoinColumn(name = "customer_id")配置是正确的,不需要修改为customer_idx,之前的临时方案只是绕开了注解不匹配导致的约束问题,但生成了不合理的表结构,修复子实体的关联注解后即可恢复正常配置。
内容的提问来源于stack exchange,提问作者zappee
相关产品推荐
相关产品推荐

