Hibernate映射继承关系

2023-05-16 13:15:25 浏览数 (3)

在Hibernate中,继承关系是面向对象编程中常见的一个概念,主要涉及到父类与子类之间的关系。在实际开发过程中,我们有时候需要将继承关系映射到数据库中,以便进行数据操作。在Hibernate中,继承关系的映射可以使用三种方式,分别是单表继承、多表继承和一对一继承。

一、Hibernate继承关系

在面向对象编程中,继承是指在一个类的基础上扩展新的类,扩展后的类具有父类的所有属性和方法,并可以添加新的属性和方法。在Hibernate中,继承关系是指一个实体类继承自另一个实体类。Hibernate中的实体类是指对应于数据库中一张表的Java类,继承关系的映射将子类和父类的属性映射到同一张表中或者分别映射到不同的表中。

在Hibernate中,继承关系的映射方式主要有三种,分别是单表继承、多表继承和一对一继承。

单表继承

在单表继承中,继承关系的子类和父类使用同一个表。子类和父类有共同的属性,而子类定义的新属性,则沿用父类的属性,使用null来填充该属性。在映射到数据库时,使用表中的一个自增长id来区分子类和父类实体。

多表继承

多表继承是指每个实体类都映射到不同的表中,这样可以彼此独立地进行操作。父类和子类之间是基于主键的关系映射,因此,在关系表中需要定义外键来表达继承关系。

一对一继承

一对一继承是指每个实体类映射到一个表中,同时每个表之间具有一对一的关系映射。在这种情形中,父子之间并不会共享某些字段,因此,嵌套不是必须的。

二、单表继承映射示例

在本文中,我们将从单表继承开始,展示如何使用Hibernate实现继承关系的映射。下面是两个Java类,我们将使用这两个类来演示单表继承的映射。

代码语言:javascript复制
@Entity
@Table(name = "person")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Person {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    public Person() {

    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Entity
public class Employee extends Person {
    
    private BigDecimal salary;

    public BigDecimal getSalary() {
        return salary;
    }
    
    public void setSalary(BigDecimal salary) {
        this.salary = salary;
    }
}

Person类

在Person类中,我们使用@Entity注解来指定这是一个实体类,@Table注解指定所映射的数据库表名。在类中定义了一个主键的id字段和一个name字段,因为我们使用的是单表继承,这些字段在数据库中都会共用同一张表。

Employee类

在Employee类中,我们定义了一个salary字段,这个字段是新添加的,不在Person类中定义,它将共享Person类在数据库表中定义的字段。

为了将我们的继承层次结构映射到关系数据库中,我们需要在表中添加一个类型标识符。这个标识符可以是字符串(例如"employee"、"person"),或者是数字(例如1、2),用来分辨出当前记录属于哪种类型。

下面是一个创建表的示例:

代码语言:javascript复制
CREATE TABLE person (
    id BIGINT NOT NULL PRIMARY KEY,
    name VARCHAR(50),
    DTYPE VARCHAR(31) NOT NULL,
    salary DECIMAL(10, 2)
);

在上面的示例中,我们添加了DTYPE字段作为标识符,用来标识存储到表中的记录属于哪种类型。DTYPE字段需要在映射Java类中使用@Inheritance注解指定继承策略为InheritanceType.SINGLE_TABLE。

0 人点赞