You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 22:06:03