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方法。 不过,使用@Embeddabletypes可以达到几乎相同的目标。 唯一的区别是你不能重复@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