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

2025-06-19 16:50

本文主要是介绍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 VjavascriptARCHAR(255),
    lives INTEGER,        -- Cat 的字段
    canFetch BOOLEAN,     -- Dog 的字段
    dtype VARCHAR(10)     -- 鉴别器列(值如 "CAT"/"DOG")
);

1-3、注意事项

  • 优点:
    查询效率高(无 JOIN 操作)。
    简单易用。

  • 缺点:
    数据冗余:子类特有字段在非对应记录中为 NULL。
    字段约束弱:非空约束(NOT NULL)无法用于子类特有字段(因为其他子类记录中这些字段为 NULL)。

  • 适用场景:继承层次简单、子类字段差异小、查询性能要求高的场景。

二、连接表继承(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、注意事项

  • 优点:
    符合数据库范China编程式,无冗余字段。
    支持子类字段的非空约束。
  • 缺点:
    查询需要 JOIN 操作,性能较低(尤其层次深时)。
    插入需操作多张表。
  • 适用场景:数据结构规范、子类字段差异大、对冗余敏感的场景。

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

3-1、原理

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

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

3-2、使用方法

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

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

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

生成的表结python构如下:

-- 父类 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、注意事项

  • 优点:
    查询具体类时效率高(无需 JOIN)。
    无冗余字段。

  • 缺点:
    多态查询性能差:查询父类(如 Shape)需 UNION 所有子表。
    主键生成策略需用 TABLE 或 SEQUENCE(避免不同子表主键冲突)。

  • 适用场景:多态查询少、主要操作具体子类的场景。

四、总结对比

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

通用注意事项

  • 抽象父类:若父类是抽象的,使用 @MappedSuperclass 代替 @Entity(仅用于继承字段,不映射表)。

  • 鉴别器列:单表继承必须用 @DiscriminatorColumn 和 @DiscriminatorValue。

  • 多态查询:连接表继承和单表继承对多态查询支持较好。

  • 主键策略:避免在 TABLE_PER_CLASS 中使用 IDENTITY 主键生成(不同表主键可能冲js突)。

总结

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

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

这篇关于Java继承映射的三种使用方法示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155132

相关文章

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter

MySQL中比较运算符的具体使用

《MySQL中比较运算符的具体使用》本文介绍了SQL中常用的符号类型和非符号类型运算符,符号类型运算符包括等于(=)、安全等于(=)、不等于(/!=)、大小比较(,=,,=)等,感兴趣的可以了解一下... 目录符号类型运算符1. 等于运算符=2. 安全等于运算符<=>3. 不等于运算符<>或!=4. 小于运

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项