JPA / Hibernate差异MappedSuperclass和Entity Abstract Class

时间:2013-05-19 11:15:39

标签: database hibernate java-ee jpa

我想知道MappedSuperclassEntity Abstract Class之间有什么区别,当你想要从Hibernate中的超类派生时。我知道Hibernate不会在数据库中为MappedSuperclass创建表。我在JavaEE doc 中读到了“抽象实体就像具体实体,但无法实例化”。由于无法实例化,因此我推断数据库中存在无匹配表。我是对的吗?

如果是这样,使用MappedSuperclassEntity Abstract Class之间的区别是什么?在每种情况下对软件和数据库的影响是什么?

1 个答案:

答案 0 :(得分:14)

MappedSuperclass使用继承来进行字段和代码重用。例如,如果您希望所有实体都有Long idLong version字段,则可以将它们全部扩展为BaseEntity类注释,其中包含MappedSuperclass这两个字段,以及他们的getter,setter等。但是你永远不会有一个与BaseEntity有关联的实体:该关联总是与BaseEntity的特定子类有关。

父实体用于“实体多态”。例如,您可以想象有两种MessageEmailMessageSmsMessage。两者都包含源,目标和正文。但是EmailMessage会有一个电子邮件地址和一个主题,而SmsMessage会有一个电话号码。

你可以想象一个Person实体包含Message类型的已发送消息的集合。该集合实际上包含EmailMessage和SmsMessage的实例。 Hibernate将决定实例化哪一个,具体取决于用于继承映射的继承策略:

  • 所有消息都可以存储在同一个表中,Hibernate将使用包含消息类型的鉴别器列
  • EmailMessage可以存储在一个表中,而SmsMessage存储在另一个表中
  • 或两个实体共有的字段(源,目标,正文)可以存储在一个comon表中,第二个表中特定于EmailMessage的字段,以及第三个表中特定于SmsMessage的字段。