JPA(Hibernate)如何将嵌套对象列表持久化到同一张表?
问题解决说明
错误根因
@OneToMany注解仅适用于@Entity修饰的实体类之间的关联映射,你的SessionsMissed是@Embeddable修饰的可嵌入类,不属于实体类,所以触发「targeting an unmapped class」报错@Embedded注解只能用于单个嵌入对象的映射,不能作用在集合类型上
解决方案
你需要用@ElementCollection注解完成Embeddable类型集合的映射,不需要将SessionsMissed改为实体类,调整后的代码如下:
Attendance实体类调整
@Entity @Table(name="Attendance") public class Attendance { @Id @Column(name="Id") int id; // 替换原来的@Embedded和@OneToMany注解 @ElementCollection // 指定存储集合数据的表信息,joinColumns配置和主表关联的外键 @CollectionTable(name = "Attendance_Sessions", joinColumns = @JoinColumn(name = "Attendance_Id")) List<SessionsMissed> days; //其他成员变量、getter、setter方法 }
SessionsMissed类无需修改(保留@Embeddable即可)
@Embeddable public class SessionsMissed{ @Column(name="Date") String date; @Column(name="Session1") String presentForOne; @Column(name="Session2") String presentForTwo; //其他成员变量、getter、setter方法 }
补充说明
关系型数据库无法在单表的一行中存储多条子集合数据,因此会自动生成一张子表存储SessionsMissed的集合内容,但你不需要为SessionsMissed单独定义实体、也不需要手动维护这张子表,所有操作都可以通过Attendance实体完成,不需要像实体关联方案那样额外编写子表的DAO、Service逻辑,符合你的轻量化需求。
内容的提问来源于stack exchange,提问作者ram
相关产品推荐
相关产品推荐

