JPA使用@ElementCollection关联非主键字段时查询关联集合为空如何解决
问题修复方案
问题根源
- JPA中
@JoinColumn默认会关联主实体的主键字段(也就是你Student类中标记了@Id的id字段),但你的student_uniform表用student_name字段存储学生姓名,需要关联student表的name字段而非主键id,因此出现字段匹配错误导致关联集合为空。 - 额外注意:你的Student实体中
studentName字段未显式指定数据库列映射,JPA默认会映射为student_name列,而你的student表中存储姓名的列是name,这个字段本身就会映射错误,也会影响后续关联。
修复步骤
第一步:修正Student实体姓名字段的映射
给studentName字段添加@Column注解指定对应数据库列:
@Column(name = "name", nullable = false) private String studentName;
第二步:修正集合关联的关联字段配置
给@JoinColumn添加referencedColumnName属性,指定关联主表的name字段:
@ElementCollection(fetch = FetchType.LAZY) @Fetch(FetchMode.SUBSELECT) @CollectionTable(name="student_uniform", joinColumns = @JoinColumn(name="student_name", referencedColumnName = "name") ) @Column(name="uniform") private Set<String> studentUniforms;
可选优化建议
当前关联用姓名作为外键存在重复风险,更合理的设计是修改student_uniform表添加student_id字段关联student表的id主键,对应修改@JoinColumn的配置即可,关联性能和数据一致性会更好。
内容的提问来源于stack exchange,提问作者Juan Villaseca
相关产品推荐
相关产品推荐

