Inheritance 通过注释实现多态JPA的最佳实践

Inheritance 通过注释实现多态JPA的最佳实践,inheritance,jpa,annotations,polymorphism,Inheritance,Jpa,Annotations,Polymorphism,我正在尝试使用Hibernate和JPA注释来设置多态行为 创建一个(抽象)类来封装继承层次结构参与持久化所需的状态和行为似乎是明智的(甚至可能是必要的);比如说 我需要注释一个Id属性,如果不将字段公开,我无法在接口中这样做,以避免超类上出现“实体上未指定标识符”异常 如果我使用表/类层次结构方法,我需要子类来提供鉴别器值 以这种方式从抽象类继承到持久性是好还是坏的做法?利/弊是什么?在JPA中有处理继承的最佳实践吗?我不确定你的问题是否有一个绝对的答案,这实际上取决于你的特殊情况以及你想

我正在尝试使用Hibernate和JPA注释来设置多态行为

创建一个(抽象)类来封装继承层次结构参与持久化所需的状态和行为似乎是明智的(甚至可能是必要的);比如说

  • 我需要注释一个Id属性,如果不将字段公开,我无法在接口中这样做,以避免超类上出现“实体上未指定标识符”异常
  • 如果我使用表/类层次结构方法,我需要子类来提供鉴别器值

以这种方式从抽象类继承到持久性是好还是坏的做法?利/弊是什么?在JPA中有处理继承的最佳实践吗?

我不确定你的问题是否有一个绝对的答案,这实际上取决于你的特殊情况以及你想从OO的角度表达什么。提供一些例子可能会有所帮助

但我怀疑您可能想了解映射的超类。以下是JPA规范的一点摘录:

一个实体可以从一个实体继承 提供持久性 实体状态和映射信息, 但它本身并不是一个实体。 通常情况下,这种方法的目的是 映射的超类用于定义状态 以及常见的映射信息 可以创建多个实体类

映射的超类与实体不同, 不可查询且无法传递 作为
EntityManager
的参数,或
查询
操作。地图 超类不能是 持久的关系

抽象类和具体类都可以 被指定为映射的超类。
MappedSuperclass
注释(或
映射超类
XML描述符 元素)用于指定映射的 超类

被指定为
MappedSuperclass
没有单独的 为其定义的表。它的映射 信息应用于实体 从中继承的

我认为您还应该阅读JPA支持的各种继承策略,这些策略在数据库级别(每个类层次结构一个表、每个具体类一个表、连接的子类)表示继承,因为它们没有为多态查询提供相同级别的支持。JPA规范恰当地涵盖了这一点

以下是相关参考资料

工具书类
  • JPA1.0规范
    • 2.1.9继承
    • 2.1.10遗传映射策略
  • Hibernate注释参考指南