Hibernate映射子类被加载为父类的问题排查与解决
Hibernate继承映射加载异常排查与解决
我定义了Project类,以及父类Resource和它的两个子类StorageResource、ComputeResource,使用Hibernate 5.3.7.Final版本配置如下映射:
@Entity @Table(name = "PROJECTS", ...}) public class Project implements Serializable { ... @OneToMany( mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true ) private List<Resource> resources; ... } @Entity @Table(name = "resources") @Inheritance(strategy = InheritanceType.JOINED) public class Resource implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; @ManyToOne private Project project; ... } @Entity @Table(name = "storage_resources") @PrimaryKeyJoinColumn(name = "id") public class StorageResource extends Resource implements Serializable { ... } @Entity @Table(name = "compute_resources") @PrimaryKeyJoinColumn(name = "id") public class ComputeResource extends Resource implements Serializable { ... }
保存两个子类实例到数据库时一切正常,但加载项目及其关联资源时出现异常:
- 存储资源记录能正确加载为
StorageResource实例 - 计算资源记录被加载为
Resource实例,而非预期的ComputeResource实例
对比两个子类的映射配置,确认代码层面配置完全一致,耗时两天排查后发现,问题出在运行环境的Hibernate配置文件中——缺失了ComputeResource的映射配置项:
<mapping class="....ComputeResource"/>
添加该配置项后,映射加载恢复正常。
内容的提问来源于stack exchange,提问作者Giorgio
相关产品推荐
相关产品推荐

