Hibernate多对一关联保存报错:equipment_model表无name_model列
问题解决与答疑
报错原因及修复方案
报错提示column "name_model" of relation "equipment_model" does not exist,结合Hibernate生成的SQLinsert into operation.equipment_model (name, id) values (?, ?),核心问题出在实体属性与数据库列的映射不匹配,还有代码逻辑冗余:
- 字段映射不匹配
EquipmentModel实体中的nameModel属性,Hibernate默认会把驼峰命名转换为下划线格式的数据库列(即name_model),但你的数据库表equipment_model中对应的列是name,两者不匹配导致报错。需在nameModel的@Column注解里显式指定数据库列名:
@Column(nullable = false, name = "name") private String nameModel;
- 冗余外键字段
Equipment实体中手动定义的equipment_model_id字段完全冗余——@ManyToOne关联注解会自动维护外键关系,手动添加该字段不仅没必要,还可能和Hibernate的自动外键逻辑冲突,直接删除即可。同时建议给@ManyToOne添加@JoinColumn显式指定外键列名,避免Hibernate使用默认命名:
@NotNull @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JsonIgnore @JoinColumn(name = "equipment_model_id") private EquipmentModel equipmentModel;
- 构造函数逻辑问题
当前Equipment构造函数里自动new了一个EquipmentModel实例,但这个新实例的nameModel(对应数据库name列)为空,而数据库列是必填项,即使修复映射,也会因必填字段为空报错。建议去掉构造函数里自动创建EquipmentModel的逻辑,根据业务需求手动赋值(关联已有模型或创建新模型并设置name)。
关于创建Equipment是否必须同步创建EquipmentModel的答疑
不是必须的,完全取决于业务需求:
- 如果业务要求Equipment关联已有的EquipmentModel,只需将从数据库查询到的EquipmentModel实例赋值给Equipment的
equipmentModel属性,Hibernate会自动维护外键关联,不会创建新的EquipmentModel。 - 如果需要为新Equipment创建对应的新EquipmentModel,要确保新创建的EquipmentModel实例的
nameModel字段有值(数据库name列必填),同时因为设置了cascade = CascadeType.ALL,保存Equipment时会自动级联保存关联的EquipmentModel。
修改后的代码示例
EquipmentModel实体
@Entity @Table(name="equipment_model") public class EquipmentModel implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; @Column(nullable = false, name = "name") private String nameModel; @OneToMany(mappedBy = "equipmentModel", cascade = CascadeType.ALL) private List<Equipment> equipments; // Getters and Setters }
Equipment实体
@Entity @Table(name="equipment") public class Equipment implements Serializable { private static final long serialVersionUID = 1L; public Equipment(){} @Id @GeneratedValue(strategy = GenerationType.AUTO) private UUID id; @Column(nullable = false) private String name; @NotNull @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JsonIgnore @JoinColumn(name = "equipment_model_id") private EquipmentModel equipmentModel; // Getters and Setters }
内容的提问来源于stack exchange,提问作者Jamil Souza
相关产品推荐
相关产品推荐

