6

我想知道一个MappedSuperclassEntity Abstract Class想要从Hibernate. 我知道这Hibernate不会在数据库中为MappedSuperclass. 我在JavaEE文档中读到“抽象实体就像具体实体,但不能被实例化”。由于它们无法实例化,我推断数据库中没有匹配的表。我对吗?

MappedSuperclass如果是这样,使用 a和 an之间实际上有什么区别Entity Abstract Class,每种情况下对软件和数据库的影响是什么?

4

1 回答 1

19

MappedSuperclass 使用继承来重用字段和代码。例如,如果您希望所有实体都有一个Long id和一个Long version字段,您可以让它们都扩展一个BaseEntity带有这两个字段以及它们的 getter、setter 等注释的类MappedSuperclass。但是您永远不会有一个具有关联的实体与 BaseEntity:关联将始终与 BaseEntity 的特定子类。

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

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

  • 所有消息都可以存储在同一个表中,Hibernate 将使用包含消息类型的鉴别器列
  • EmailMessage 可以存储在一个表中,而 SmsMessage 可以存储在另一个表中
  • 或者两个实体(源、目标、正文)共有的字段可以存储在一个通用表中,特定于 EmailMessage 的字段存储在第二个表中,特定于 SmsMessage 的字段存储在第三个表中。
于 2013-05-19T17:53:03.480 回答