Spring Boot JPA使用@EmbeddedId出现cocktail_id重复映射错误求助
问题根因
报错的核心原因是cocktail_id数据库列在你的代码中存在多处映射声明,Hibernate默认禁止多个属性同时对同一个列执行写入操作,所以触发了映射异常。
解决方案
- 检查
CocktailIngredient实体类是否存在关联Cocktail表的映射字段(你当前贴出的代码没有包含这部分,是大概率的冲突来源),通常是如下的关联代码:
@ManyToOne @JoinColumn(name = "cocktail_id") // 此处同样映射了cocktail_id列,和主键类中的声明冲突 private Cocktail cocktail;
- 给关联字段的
@JoinColumn注解添加insertable = false, updatable = false配置,避免两处映射冲突,修改后代码如下:
@ManyToOne @JoinColumn(name = "cocktail_id", insertable = false, updatable = false) private Cocktail cocktail;
- 调整
CocktailIngredientId复合主键类中cocktailId字段的注解配置,删除你现在添加的insertable = false, updatable = false参数,主键字段需要允许插入才能正常赋值,修改后如下:
@Column(name = "cocktail_id", nullable = false) private Long cocktailId;
优化方案(可选)
如果你不想手动给复合主键的cocktailId属性赋值,可以使用@MapsId注解关联外键和主键字段,不需要设置insertable/updatable参数也不会出现映射冲突:
@ManyToOne @MapsId("cocktailId") @JoinColumn(name = "cocktail_id") private Cocktail cocktail;
使用该方式后,保存实体时Hibernate会自动将关联的cocktail对象的主键值同步到复合主键的cocktailId属性中,不需要手动赋值。
内容的提问来源于stack exchange,提问作者Sadece Sadece
相关产品推荐
相关产品推荐

