java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java继承映射使用

Java继承映射的三种使用方法示例

作者:心疼你的一切

继承在Java中扮演着重要的角色,它允许我们创建一个类(子类),该类继承另一个类(父类)的所有属性和方法,这篇文章主要介绍了Java继承映射的三种使用方法示例,需要的朋友可以参考下

前言

在 Java 中,ORM(对象关系映射)框架(如 Hibernate/JPA)处理继承关系时,主要有三种继承映射策略:单表继承(Single Table)、连接表继承(Joined Table) 和 每个具体类一张表(Table Per Class)。以下介绍它们的原理、使用方法和注意事项

博客将会介绍如何实现 Java 三种继承映射的使用。希望这篇博客对Unity的开发者有所帮助。
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.下面就让我们进入正文吧 !

一、单表继承(Single Table Inheritance)

1-1、原理

所有类共享一张表:整个继承层次结构的所有字段都存储在同一张数据库表中。

鉴别器列(Discriminator):使用一个特殊列(如 dtype)区分不同子类的记录。

1-2、使用方法

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 指定策略
@DiscriminatorColumn(name = "dtype") // 鉴别器列名
public class Animal {
    @Id
    private Long id;
    private String name;
}

@Entity
@DiscriminatorValue("CAT") // 鉴别器值
public class Cat extends Animal {
    private int lives;
}

@Entity
@DiscriminatorValue("DOG")
public class Dog extends Animal {
    private boolean canFetch;
}

表结构如下:

CREATE TABLE Animal (
    id BIGINT PRIMARY KEY,
    name VARCHAR(255),
    lives INTEGER,        -- Cat 的字段
    canFetch BOOLEAN,     -- Dog 的字段
    dtype VARCHAR(10)     -- 鉴别器列(值如 "CAT"/"DOG")
);

1-3、注意事项

二、连接表继承(Joined Table Inheritance)

2-1、原理

父类独立表:父类字段存储在基表中。
子类分表存储:子类特有字段存储在独立的子表中,通过主键与基表关联(一对一关系)。

2-2、使用方法

@Entity
@Inheritance(strategy = InheritanceType.JOINED) // 指定策略
public class Vehicle {
    @Id
    private Long id;
    private String manufacturer;
}

@Entity
public class Car extends Vehicle {
    private int seatCount;
}

@Entity
public class Truck extends Vehicle {
    private double payloadCapacity;
}

生成的表结构如下:

-- 基表(存储公共字段)
CREATE TABLE Vehicle (
    id BIGINT PRIMARY KEY,
    manufacturer VARCHAR(255)
);

-- 子表(存储特有字段 + 关联基表主键)
CREATE TABLE Car (
    id BIGINT PRIMARY KEY,       -- 与 Vehicle.id 相同
    seatCount INTEGER,
    FOREIGN KEY (id) REFERENCES Vehicle(id)
);

CREATE TABLE Truck (
    id BIGINT PRIMARY KEY,
    payloadCapacity DOUBLE,
    FOREIGN KEY (id) REFERENCES Vehicle(id)
);

2-3、注意事项

三、每个具体类一张表(Table Per Class)

3-1、原理

每个具体类独立成表:每个非抽象子类拥有一张独立的表,表中包含自身字段 + 所有继承的父类字段。

抽象父类无表:父类不映射到数据库表(仅用于 Java 继承)。

3-2、使用方法

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 指定策略
public abstract class Shape {
    @Id
    private Long id;
    private String color;
}

@Entity
public class Circle extends Shape {
    private double radius;
}

@Entity
public class Rectangle extends Shape {
    private double width;
    private double height;
}

生成的表结构如下:

-- 父类 Shape 无表
CREATE TABLE Circle (
    id BIGINT PRIMARY KEY,
    color VARCHAR(255),   -- 继承自 Shape
    radius DOUBLE
);

CREATE TABLE Rectangle (
    id BIGINT PRIMARY KEY,
    color VARCHAR(255),   -- 继承自 Shape
    width DOUBLE,
    height DOUBLE
);

3-3、注意事项

四、总结对比

策略单表继承(SINGLE_TABLE)连接表继承(JOINED)每个具体类一张表(TABLE_PER_CLASS)
表数量1 张N + 1 张(N=子类数)N 张(N=具体子类数)
数据冗余高(大量 NULL)
查询性能⭐⭐⭐⭐⭐(无 JOIN)⭐⭐(需 JOIN)⭐⭐⭐(具体类快,父类慢)
字段约束弱(不可用 NOT NULL)强(支持约束)强(支持约束)
适用场景简单继承、高性能需求结构规范、减少冗余少用父类查询、操作具体子类

通用注意事项

总结

本次总结的就是 Java 三种继承映射的使用实现, 有需要会继续增加功能

到此这篇关于Java继承映射的三种使用方法的文章就介绍到这了,更多相关Java继承映射使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文