java JPA:实现模型层次结构@MappedSuperclass vs.继承
我将Play Framework 1.2.4与PostgreSQL
和JPA
一起使用。我希望有一个模型层次结构,并看到有一些替代做这件事
我有一个基类(抽象的)和两个扩展这个基类的具体类。我不想持久化这个基类,而想拥有具体的类。在基类中,我有另一个模型类作为属性,换句话说,我在基类中有@ManyToOne
关系
我的问题是,实现这一目标的最佳方式是什么?使用@MappedSuperclass
或@Inheritance
与TABLE_PER_CLASS
策略?我有点困惑,因为它们看起来几乎相当于
我还担心将来可能会遇到的查询和性能问题
# 1 楼答案
MappedSuperClass必须用于继承属性、关联和方法
当您有一个实体和多个子实体时,必须使用实体继承
您可以通过回答以下问题来判断是否需要一个或另一个:模型中是否有其他实体可以与基类关联
如果是,那么基类实际上是一个实体,您应该使用实体继承。如果不是,那么基类实际上是一个包含多个不相关实体所共有的属性和方法的类,您应该使用映射的超类
例如:
# 2 楼答案
@MappedSupperclass
与@Inheritance
注释不同@MappedSuperclass
告诉JPA提供程序包含基类持久属性,就像它们是由扩展用@MappedSuperclass
注释的超类的子类声明的一样但是,继承只在OOP世界中可见,因为从数据库的角度来看,没有基类的指示。只有子类实体将具有关联的映射表
@Inheritance
注释旨在具体化数据库表结构中的OOP继承模型。此外,您可以查询用@Inheritance
注释的基类,但不能查询用@MappedSuperclass
注释的基类现在,您希望使用^{} JPA注释的原因是实现行为驱动模式,如策略模式
另一方面,} 重用
@MappedSuperclass
只是一种使用公共基类重用基本属性、关联甚至实体@Id
的方法。然而,使用@Embeddable
类型可以实现几乎相同的目标。唯一的主要区别是不能将@Id
定义与@Embeddable
重用,但可以使用^{