Hibernate一对多关联仅获取目标实体主键列的问题求助
问题分析与解决方案
你的核心问题是试图用@OneToMany直接映射基本类型(String)的集合,这不符合JPA的关联规则——@OneToMany只能用于关联实体类,不能直接映射到数据库字段的基本类型集合。下面分点解释错误原因,并给出正确实现:
现有代码的错误原因
- employees1的错误:
@OneToMany要求关联目标是实体类(比如Employee),但你指定了Set<String>作为集合类型,同时@Column和@OneToMany不能同时使用(前者用于单个字段映射,后者用于实体关联),导致Hibernate无法解析字段访问逻辑,抛出PropertyAccessException。 - employees2的错误:
@JoinColumn并没有tableName这个参数,你误用了属性;同样,@OneToMany不能直接映射基本类型集合,Hibernate尚未支持这种场景,因此抛出NotYetImplementedException。
正确实现方式
要在Company实体中直接获取员工ID列表,应该使用@ElementCollection配合@CollectionTable,将其映射到Employee表的eId字段,关联条件为company_id = cId:
Employee实体(可保持原有结构,可选添加双向关联)
@Entity public class Employee { @Id private String eId; private String eName; // 可选:添加双向关联,方便从Employee端访问Company @ManyToOne @JoinColumn(name = "company_id") private Company company; // getter、setter方法 }
Company实体的正确配置
@Entity public class Company { @Id private String cId; private String cName; @ElementCollection(fetch = FetchType.EAGER) @CollectionTable( name = "Employee", // 指定关联的表名 joinColumns = @JoinColumn(name = "company_id", referencedColumnName = "cId") // 关联字段 ) @Column(name = "eId") // 要获取的目标字段 private Set<String> employeeIds = new HashSet<>(); // getter、setter方法 }
这样配置后,Hibernate会自动查询Employee表中company_id匹配当前Company的cId的所有eId值,封装到employeeIds集合中,完全满足你仅获取员工ID列表的需求。
内容的提问来源于stack exchange,提问作者shashank
相关产品推荐
相关产品推荐

