Hibernate&Spring中ManyToOne与OneToMany映射错误排查求助
问题分析与修正方案
从你抛出的ORA-00904: "GROUPITE0_"."ID": invalid identifier异常,结合实体映射代码来看,主要存在以下几个关键错误:
1. 实体类与主键类的命名/字段名混乱
Group实体中声明的关联集合是List<GroupItems> groupItems,但实际关联的实体类名为GroupITEM(大小写混乱、复数形式不统一)- 主键类定义为
GroupItemPK,但GroupITEM实体中却使用GroupITEMtPK(明显笔误) GroupItemPK中的字段id对应数据库表的GROUP_ID,命名不符合语义,容易和实体主键混淆;另外merchantId字段实际对应表的ITEM_ID,命名完全错误
2. @ManyToOne关联的@JoinColumn配置错误
在GroupITEM实体中,你写了:
@ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "ID") @JsonBackReference private Group group;
这里的@JoinColumn(name = "ID")完全错误:数据库中ITEM_GROUP表的外键列是GROUP_ID,而非ID,Hibernate找不到该字段才抛出了无效标识符异常。同时因为这个字段已经是嵌入式主键的一部分,需要设置insertable = false, updatable = false避免重复操作。
3. 嵌入式主键与关联实体的映射缺失
对于复合主键包含外键的场景,需要使用@MapsId注解关联主键字段与关联实体的ID,否则Hibernate无法正确绑定两者的关系。
修正后的完整代码示例
1. 修正后的Group实体
@Entity @Table(name = "GROUPS") public class Group { @Id @Column(name = "ID", nullable = false) @SequenceGenerator(name = "groupIdGenerator", sequenceName = "GROUP_SEQ", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "groupIdGenerator") private int id; @Column(name = "GROUP_NAME") private String groupName; @JsonManagedReference @OneToMany(fetch = FetchType.EAGER, mappedBy = "group", cascade = CascadeType.ALL) private List<GroupItem> groupItems = new ArrayList<>(); // 省略getter、setter方法 }
2. 修正后的复合主键类GroupItemPK
@SuppressWarnings("serial") @Embeddable public class GroupItemPK implements Serializable { @Column(name = "ITEM_ID") private String itemId; // 修正字段名,对应表的ITEM_ID @Column(name = "GROUP_ID") private int groupId; // 修正字段名,对应表的GROUP_ID // 省略构造方法、getter、setter、equals和hashCode方法 }
3. 修正后的GroupItem关联实体
@Entity @Table(name = "ITEM_GROUP") public class GroupItem { @EmbeddedId private GroupItemPK id; @ManyToOne(fetch = FetchType.LAZY) @MapsId("groupId") // 关联主键中的groupId字段 @JoinColumn(name = "GROUP_ID", insertable = false, updatable = false) @JsonBackReference private Group group; // 省略getter、setter方法 }
这样修正后,Hibernate就能正确生成关联查询的SQL,不会再抛出无效标识符异常,同时也能正常支持通过Group实体级联保存GroupItem的操作。
内容的提问来源于stack exchange,提问作者Gog1nA
相关产品推荐
相关产品推荐

