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 的字段存储在第三个表中。