JPA/Hibernate差异MappedSuperclass和Entity Abstract Class

arj*_*soh 4 database hibernate jpa java-ee

我想知道是什么样的区别MappedSuperclassEntity Abstract Class当一个人想要从一个超类派生Hibernate.我知道Hibernate不会在数据库中创建一个表MappedSuperclass.我在JavaEE文档中读到"抽象实体就像具体实体但不能被实例化".由于它们无法实例化,我推断数据库中没有匹配的表.我对吗?

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

JB *_*zet 15

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

父实体用于"实体多态性".例如,你可以想象有两种Message:a EmailMessage和a SmsMessage.两者都包含源,目标和正文.但EmailMessage会有一个电子邮件地址和一个主题,而SmsMessage会有一个电话号码.

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

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