有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JPA:实现模型层次结构@MappedSuperclass vs.继承

我将Play Framework 1.2.4与PostgreSQLJPA一起使用。我希望有一个模型层次结构,并看到有一些替代做这件事

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

我的问题是,实现这一目标的最佳方式是什么?使用@MappedSuperclass@InheritanceTABLE_PER_CLASS策略?我有点困惑,因为它们看起来几乎相当于

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


共 (2) 个答案

  1. # 1 楼答案

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

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

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

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

    例如:

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

    @MappedSupperclass@Inheritance注释不同

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

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

    @Inheritance注释旨在具体化数据库表结构中的OOP继承模型。此外,您可以查询用@Inheritance注释的基类,但不能查询用@MappedSuperclass注释的基类

    现在,您希望使用^{}JPA注释的原因是实现行为驱动模式,如策略模式

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