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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 00:06:04