通过注释进行多态JPA的最佳实践

时间:2010-08-09 18:11:50

标签: inheritance jpa annotations polymorphism

我正在尝试使用带有JPA注释的Hibernate设置多态行为。

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

  • 我需要注释一个Id属性,我不能在接口中进行操作而不将该字段设为公共属性,以避免超类上的“实体上没有指定标识符”异常
  • 如果我使用table-per-class-hierarchy方法,我需要子类来提供DiscriminatorValue

从一个抽象类继承加上持久性这种方式是一种好的还是坏的做法?有哪些优点/缺点?是否有关于在JPA中处理继承的最佳实践?

1 个答案:

答案 0 :(得分:7)

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

但我怀疑你可能想了解 Mapped Superclasses 。以下是JPA规范的一些摘录:

  

实体可以从a继承   提供持久性的超类   实体状态和映射信息,   但这本身并不是一个实体。   通常,这样的目的   映射的超类是定义状态   和映射常见的信息   到多个实体类。

     

映射的超类,与实体不同,   不可查询,无法传递   作为EntityManager或{。}的论据   Query次操作。映射   超类不能成为一个目标   持久的关系。

     

抽象和具体课程都可以   被指定为映射的超类。   MappedSuperclass注释(或   mapped-superclass XML描述符   element)用于指定映射   超类。

     

指定为的班级   MappedSuperclass没有单独的   为它定义的表。它的映射   信息应用于实体   继承自它。

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

以下相关参考文献。

参考