Hibernate使用@ManyToMany报Illegal attempt to map a non collection错误原因问询
错误原因
- ToMany类注解使用场景错误:
@ManyToMany、@OneToMany这类用于映射多端关联的注解,只能标注在集合类型的属性上(例如Set<User>、List<Game>),你将其标注在int这种单值基本类型属性上,直接触发了当前报错的校验规则。 - User类主键注解滥用:User类的
id是主键字段,仅需@Id、@GeneratedValue、@Column三个注解即可,额外添加的@ManyToMany完全不符合逻辑,主键是单值唯一标识,不存在多对多关联的适用场景。 - 需求与关联映射逻辑不匹配:你的业务需求是单场Game对应1个赢家、1个输家,属于典型的多对一关联(多场Game可对应同一个User作为赢家/输家),完全不需要使用
@ManyToMany;同时关联属性应该直接映射User实体,而非手动存储int类型的id,Hibernate会自动维护外键关联,不需要你手动存储关联主键。
修正后的代码示例
User类修正
@Entity public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) @Column(unique = true, nullable = false) // 移除多余的@ManyToMany注解 private int id; // 其余字段、getter/setter省略 }
Game类修正
@Entity public class Game { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @ManyToOne @JoinColumn(nullable = false) // 类型改为User实体,Hibernate自动生成外键存储关联用户的id private User winner; @ManyToOne @JoinColumn(nullable = false) // 类型改为User实体 private User loser; // 其余字段、getter/setter省略 }
后续如果需要获取赢家/输家的id,直接调用winner.getId()、loser.getId()即可。
内容的提问来源于stack exchange,提问作者dronikk
相关产品推荐
相关产品推荐

