MappedSuperclass扩展了另一个MappedSuperclass

时间:2018-10-10 03:47:17

标签: java hibernate jpa

在JPA /休眠模式下,像BetterBaseEntity这样的映射超类可以成为另一个映射超类BaseEntity的子类吗?

我想保留BaseEntity,因为几乎每个人都使用它,但是想添加一些新的父功能。

1 个答案:

答案 0 :(得分:2)

关系数据库没有直接的方法将类层次结构映射到数据库表上。

为解决此问题,JPA规范提供了几种策略:

MappedSuperclass –父类不能是实体

单个表–来自具有共同祖先的不同类别的实体放置在单个表中

联接表–每个类都有其表,查询子类实体需要联接表

每个类的表–一个类的所有属性都在其表中,因此不需要联接

每种策略都会导致不同的数据库结构。

实体继承意味着我们可以在查询超类时使用多态查询来检索所有子类实体。

由于Hibernate是JPA实现,因此它包含以上所有内容以及与继承相关的一些Hibernate特定功能。

MappedSuperclass:-

使用MappedSuperclass策略,继承仅在类中可见,而在实体模型中不可见。

首先创建一个代表父类的Person类:

@MappedSuperclass
public class Person {

    @Id
    private long personId;
    private String name;

    // constructor, getters, setters

} 请注意,该类不再具有@Entity批注,因为它本身不会持久保存在数据库中。

接下来,让我们添加一个Employee子类:

@Entity
public class MyEmployee extends Person {
    private String company;
    // constructor, getters, setters 
}

在数据库中,这将对应一个“ MyEmployee”表,该表具有三列,用于子类的声明字段和继承字段。

如果我们使用此策略,则祖先不能包含与其他实体的关联。

有关更多详细信息,请参考-

https://ritesh-shukla.blogspot.com/2018/10/hibernate-inheritance-mapping.html?m=1