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

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1