HSQL数据库基于Jakarta实现JPA继承映射时子类属性未生成问题
问题产生原因
- 核心原因是子类中定义的属性均为双向
@OneToMany关联的被维护端属性,JPA规范中一对多关联的外键默认存储在多的一方对应的数据库表中,不会在一的一方(也就是当前子类)对应的表中生成字段:ProfesorDAO中的actividadesPropuestas关联的外键已经生成在ACTIVIDADES表的ID_PROFESOR字段,和你提供的建表脚本完全匹配SocioDAO中的registrosAClase关联的外键已经生成在REGISTROS表的ID_SOCIO字段
- 目前两个子类中没有定义非关联类型的普通自有字段(比如字符串、数值类型的基础业务字段),所以子类表仅保留了关联父表的主键字段,属于符合JPA规范的正常表现。
- 若你确实在子类中添加了普通字段仍未生成,可排查是否存在JPA配置错误、实体扫描未覆盖子类、Getter/Setter方法不符合规范的问题。
解决建议
- 若只是疑惑关联字段为何没有出现在子类表:当前表现完全符合设计逻辑,无需修改。关联关系的维护只需要在插入多侧数据(比如
ActividadDeportivaDAO、RegistroDAO)时,给对应的关联属性赋值子类对象即可自动建立关联,查询子类对象时可以正常获取关联集合。 - 若需要在子类表新增自有业务字段:直接在子类中添加普通类型字段并加上
@Column等映射注解,重新生成表结构即可在子类表中看到对应字段。 - 若查询子类无法获取关联集合:可将
@OneToMany的fetch属性修改为FetchType.EAGER,或者查询时使用join fetch语法主动加载关联集合,同时确保查询时返回的是子类类型而非父类UsuarioDAO类型。 - 排查配置问题:确认JPA的DDL生成策略配置为
create/create-drop,避免旧表结构缓存影响生成结果,同时确认所有实体的Getter/Setter方法为public修饰。
内容的提问来源于stack exchange,提问作者Diego Fernández
相关产品推荐
相关产品推荐

