在 Java 中,ORM(对象关系映射)框架(如 Hibernate/JPA)处理继承关系时,主要有三种继承映射策略:单表继承(Single Table)、连接表继承(Joined Table) 和 每个具体类一张表(Table Per Class)。以下介绍它们的原理、使用方法和注意事项
博客将会介绍如何实现 Java 三种继承映射的使用。希望这篇博客对Unity的开发者有所帮助。 大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 欢迎点赞评论哦.下面就让我们进入正文吧 !
提示:以下是本篇文章正文内容,下面案例可供参考
所有类共享一张表:整个继承层次结构的所有字段都存储在同一张数据库表中。
鉴别器列(Discriminator):使用一个特殊列(如 dtype)区分不同子类的记录。
@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")
);父类独立表:父类字段存储在基表中。 子类分表存储:子类特有字段存储在独立的子表中,通过主键与基表关联(一对一关系)。
@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)
);每个具体类独立成表:每个非抽象子类拥有一张独立的表,表中包含自身字段 + 所有继承的父类字段。
抽象父类无表:父类不映射到数据库表(仅用于 Java 继承)。
@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
);策略 | 单表继承(SINGLE_TABLE) | 连接表继承(JOINED) | 每个具体类一张表(TABLE_PER_CLASS) |
|---|---|---|---|
表数量 | 1 张 | N + 1 张(N=子类数) | N 张(N=具体子类数) |
数据冗余 | 高(大量 NULL) | 无 | 无 |
查询性能 | ⭐⭐⭐⭐⭐(无 JOIN) | ⭐⭐(需 JOIN) | ⭐⭐⭐(具体类快,父类慢) |
字段约束 | 弱(不可用 NOT NULL) | 强(支持约束) | 强(支持约束) |
适用场景 | 简单继承、高性能需求 | 结构规范、减少冗余 | 少用父类查询、操作具体子类 |
通用注意事项
本次总结的就是 Java 三种继承映射的使用实现, 有需要会继续增加功能 如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢 你的点赞就是对博主的支持,有问题记得留言评论哦! 不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒!