我想知道MappedSuperclass
和Entity Abstract Class
之间有什么区别,当你想要从Hibernate
中的超类派生时。我知道Hibernate
不会在数据库中为MappedSuperclass
创建表。我在JavaEE
doc 中读到了“抽象实体就像具体实体,但无法实例化”。由于无法实例化,因此我推断数据库中存在无匹配表。我是对的吗?
如果是这样,使用MappedSuperclass
和Entity Abstract Class
之间的区别是什么?在每种情况下对软件和数据库的影响是什么?
答案 0 :(得分:14)
MappedSuperclass使用继承来进行字段和代码重用。例如,如果您希望所有实体都有Long id
和Long version
字段,则可以将它们全部扩展为BaseEntity
类注释,其中包含MappedSuperclass
这两个字段,以及他们的getter,setter等。但是你永远不会有一个与BaseEntity有关联的实体:该关联总是与BaseEntity的特定子类有关。
父实体用于“实体多态”。例如,您可以想象有两种Message
:EmailMessage
和SmsMessage
。两者都包含源,目标和正文。但是EmailMessage会有一个电子邮件地址和一个主题,而SmsMessage会有一个电话号码。
你可以想象一个Person
实体包含Message
类型的已发送消息的集合。该集合实际上包含EmailMessage和SmsMessage的实例。 Hibernate将决定实例化哪一个,具体取决于用于继承映射的继承策略: