Spring Boot嵌入式复合键搭配H2报错:字段存在却提示未找到
问题原因
你给amount字段同时标注了@Formula和@Column注解,这两个注解在Hibernate中存在冲突:
@Formula用于定义虚拟计算列,Hibernate会判定该字段无需在数据库创建物理列,仅通过SQL表达式实时计算取值@Column则指示Hibernate要在数据库表中生成对应的物理字段
两者叠加后,Hibernate会优先遵循@Formula的规则,不会在CAR表中生成AMOUNT物理列,但查询时又会尝试读取这个不存在的列,最终触发列找不到的错误。
解决办法
根据业务需求选择以下两种方案之一:
方案1:需要在数据库中存储AMOUNT字段
- 删除
@Formula注解,保留@Column(name = "AMOUNT") - 若需实现
amount / 100的转换逻辑,可在实体类中新增一个只读的瞬态属性处理:
@Column(name = "AMOUNT") private Double amount; // 计算后的值,不映射到数据库列 @Transient public Double getCalculatedAmount() { return this.amount != null ? this.amount / 100 : null; }
方案2:无需存储,仅需实时计算amount值
- 删除
@Column注解,保留@Formula - 注意
@Formula中的SQL表达式要对应数据库中实际存在的列名,例如数据库存储原始金额的列是RAW_AMOUNT,则表达式应改为:
@Formula("RAW_AMOUNT / 100") private Double amount;
- 此时
amount字段为只读状态,无法通过实体类更新其值
额外提示:嵌入式主键CarEntityId中包含@ManyToOne关联,虽然Hibernate支持这种写法,但通常建议将关联关系放在主实体类中,避免后续关联查询出现异常。
内容的提问来源于stack exchange,提问作者pixel
相关产品推荐
相关产品推荐

