JPA:实现模型层次结构 - @MappedSuperclass与@Inheritance

huz*_*yfe 59 java orm inheritance hibernate jpa

我正在使用Play Framework 1.2.4 PostgreSQLJPA.我想有一个Model层次结构,看看有一些替代方法可以做到这一点.

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

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

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

JB *_*zet 122

必须使用MappedSuperClass来继承属性,关联和方法.

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

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

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

例如:

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

  • 不会.它的工作原理就像映射的超类属性直接在实体中一样. (4认同)

Vla*_*cea 17

正如我在解释这个文章,@MappedSupperclass是不是不同的@Inheritance注解.

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

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

@Inheritance注释是为了兑现在数据库表结构的OOP继承模型.更多,您可以查询带注释的基类,@Inheritance但不能对带注释的基类执行此操作@MappedSuperclass.

现在,您想要使用@InheritanceJPA注释的原因是实现行为驱动模式,如策略模式.

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

  • “唯一的主要区别是您不能使用Embeddable重用ID定义,但可以使用MappedSuperclass做到这一点。”谢谢,我一直在努力寻找这一点。 (4认同)