JPA:实现模型层次结构 – @MappedSuperclass与@Inheritence
我正在使用PostgreSQL
和JPA
Play Framework 1.2.4。 我想有一个模型层次结构,并看到有这样做的一些替代scheme。
我有一个基类(这是抽象的)和两个扩展这个基类的具体类。 我不想坚持这个基础课,而我想要具体的课。 在基类中,我有另一个Model类作为属性,换句话说,我在我的基类中有@ManyToOne
关系。
我的问题是实现这个的最好方法是什么? 使用@MappedSuperclass
或@Inheritence
与TABLE_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
方法。 不过,使用@Embeddable
types可以达到几乎相同的目标。 唯一的区别是你不能重复@Embeddable
的@Id
定义,但你可以用@MappedSuperclass
。
- 在HQL中无关联地join
- 为什么人们继续使用XML映射文件而不是注释?
- 使用Log4j XMLconfiguration文件configurationHibernate日志logging?
- Hibernate:session.get和session.load之间的区别
- hibernate中JOIN和JOIN FETCH的区别
- JPA的hashCode()/ equals()两难
- 我如何使用MS Access的hibernate?
- 使用JPA创build具有保留字名称的字段
- 不成功:在Hibernate / JPA / HSQLDB独立版本中使用alter table XXX drop constraint YYY