【问题标题】:JPA: Implementing Model Hierarchy - @MappedSuperclass vs. @InheritanceJPA:实现模型层次结构 - @MappedSuperclass 与 @Inheritance
【发布时间】:2012-03-28 21:21:33
【问题描述】:

我正在使用带有 PostgreSQLJPA 的 Play Framework 1.2.4。我想要一个模型层次结构,看看有一些替代方法。

我有一个基类(抽象的)和两个扩展这个基类的具体类。我不想保留这个基类,而我想要有具体的类。在基类中,我有另一个模型类作为属性,换句话说,我的基类中有@ManyToOne 关系。

我的问题是实现这一点的最佳方式是什么?使用@MappedSuperclass@InheritanceTABLE_PER_CLASS 策略?我有点困惑,因为它们似乎实际上等效。

我还担心将来可能会遇到的查询和性能问题。

【问题讨论】:

  • 我已将 @Inheritence 更改为 @Inheritance,因为我认为这是一个错字。

标签: java hibernate jpa inheritance orm


【解决方案1】:

MappedSuperClass 必须用于继承属性、关联和方法。

当您有一个实体和多个子实体时,必须使用实体继承。

您可以通过回答以下问题来判断您是否需要其中一个:模型中是否有其他实体可以与基类有关联?

如果是,那么基类实际上是一个实体,你应该使用实体继承。如果不是,那么基类实际上是一个包含几个不相关实体共有的属性和方法的类,您应该使用映射的超类。

例如:

  • 您可以接收多种消息:SMS 消息、电子邮件消息或电话消息。一个人有一个消息列表。无论消息类型如何,您还可以将提醒链接到消息。在这种情况下,Message 显然是一个实体,必须使用实体继承。
  • 您的所有域对象都可以有一个创建日期、修改日期和 ID,因此您可以使它们继承自一个基本的 AbstractDomainObject 类。但是没有实体会与 AbstractDomainObject 有关联。它总是与更具体的实体相关联:客户、公司等等。在这种情况下,使用 MappedSuperClass 是有意义的。

【讨论】:

  • 非常感谢您的回答。我现在很清楚,如果我需要持久化或使用基类作为实体,我应该使用实体继承。我想知道是否存在性能问题或查询限制,尤其是使用继承的对象关系?
  • 这一切都取决于您选择哪种继承,以及哪种继承策略。
  • 就我而言(因为我不想保留基类) MappedSuperClass 似乎更合适。那么在性能和限制方面,我需要注意一些特定问题吗?
  • 没有。就像映射的超类属性直接在实体中一样。
【解决方案2】:

@MappedSupperclass@Inheritance 注释不同。

@MappedSuperclass 告诉 JPA 提供程序包含基类持久属性,就好像它们是由扩展带有 @MappedSuperclass 注释的超类的子类声明的一样。

但是,继承仅在 OOP 世界中可见,因为从数据库的角度来看,没有基类的指示。只有子类实体会有关联的映射表。

@Inheritance 注解旨在实现数据库表结构中的 OOP 继承模型。此外,您可以查询带有@Inheritance 注释的基类,但不能查询带有@MappedSuperclass 注释的基类。

现在,您想要使用 @Inheritance JPA 注释的原因是为了实现像策略模式这样的行为驱动模式。

另一方面,@MappedSuperclass 只是一种使用公共基类重用基本属性、关联甚至实体@Id 的方法。不过,您可以使用@Embeddable 类型实现几乎相同的目标。唯一的主要区别是您不能将@Id 定义与@Embeddable 一起使用,但您可以使用@MappedSuperclass 来实现。

【讨论】:

  • “唯一的主要区别是你不能用 Embeddable 重用 Id 定义,但你可以用 MappedSuperclass 做到这一点”谢谢你,我已经找了将近一个小时了。
  • '@Inheritance' 的伟大之处在于,我们可以使用多态查询。将“@Inheritance”设置为 TABLE_PER_CLASS,这和“@MappedSuperclass”有什么区别?
  • 由于 UNION ALL 查询,TABLE_PER_CLASS 效率非常低。最好使用 SINGLE_TABLE 或 JINED,如我的 High-Performance Java Persistence book 中所述。
猜你喜欢
  • 1970-01-01
  • 2013-05-02
  • 2016-05-01
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
相关资源
最近更新 更多