JPA:实现模型层次结构 – @MappedSuperclass与@Inheritence

我正在使用PostgreSQLJPA Play Framework 1.2.4。 我想有一个模型层次结构,并看到有这样做的一些替代scheme。

我有一个基类(这是抽象的)和两个扩展这个基类的具体类。 我不想坚持这个基础课,而我想要具体的课。 在基类中,我有另一个Model类作为属性,换句话说,我在我的基类中有@ManyToOne关系。

我的问题是实现这个的最好方法是什么? 使用@MappedSuperclass@InheritenceTABLE_PER_CLASS策略? 我有点困惑,因为它们看起来几乎相同。

我对于将来可能面临的查询和性能问题也有一些担忧。

MappedSuperClass必须用于inheritance属性,关联和方法。

当你有一个实体和几个子实体时,必须使用实体inheritance。

你可以通过回答这个问题来告诉你是否需要其中一个:模型中是否还有其他实体可以与基类关联?

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

例如:

  • 您可以有几种消息:短信,电子邮件或电话信息。 一个人有一个消息列表。 无论消息types如何,您还可以提供链接到消息的提醒。 在这种情况下,消息显然是一个实体,必须使用实体inheritance。
  • 所有的域对象可以有一个创builddate,修改date和ID,因此你可以使它们从一个基本的AbstractDomainObject类inheritance。 但是没有实体会与AbstractDomainObject有联系。 它将永远是一个更具体的实体的关联:客户,公司,无论如何。 在这种情况下,使用MappedSuperClass是有意义的。

正如我在本文中所解释的, @MappedSupperclass不同于@Inheritance注释。

@MappedSuperclass告诉JPA提供者包含基类的持久性属性,就好像它们是由扩展用@MappedSuperclass注解的超类的子类所声明的@MappedSuperclass

但是,inheritance仅在OOP世界中是可见的,因为从数据库的angular度来看,没有任何基类的迹象。 只有子类实体将有一个关联的映射表。

@Inheritance注释是为了实现数据库表结构中的OOPinheritance模型。 更多的,你可以查询用@Inheritance注解的基类,但是你不能用@MappedSuperclass注解的基类。

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

另一方面, @MappedSuperclass只是一种重用基本属性,关联,甚至是使用公共基类的实体@Id方法。 不过,使用@Embeddabletypes可以达到几乎相同的目标。 唯一的区别是你不能重复@Embeddable@Id定义,但你可以用@MappedSuperclass