最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java繼承映射的三種使用方法示例

 更新時間:2025年06月19日 11:29:25   作者:心疼你的一切  
繼承在Java中扮演著重要的角色,它允許我們創(chuàng)建一個類(子類),該類繼承另一個類(父類)的所有屬性和方法,這篇文章主要介紹了Java繼承映射的三種使用方法示例,需要的朋友可以參考下

前言

在 Java 中,ORM(對象關系映射)框架(如 Hibernate/JPA)處理繼承關系時,主要有三種繼承映射策略:單表繼承(Single Table)、連接表繼承(Joined Table) 和 每個具體類一張表(Table Per Class)。以下介紹它們的原理、使用方法和注意事項

博客將會介紹如何實現(xiàn) Java 三種繼承映射的使用。希望這篇博客對Unity的開發(fā)者有所幫助。
大家好,我是心疼你的一切,不定時更新Unity開發(fā)技巧,覺得有用記得一鍵三連哦。
歡迎點贊評論哦.下面就讓我們進入正文吧 !

一、單表繼承(Single Table Inheritance)

1-1、原理

所有類共享一張表:整個繼承層次結(jié)構(gòu)的所有字段都存儲在同一張數(shù)據(jù)庫表中。

鑒別器列(Discriminator):使用一個特殊列(如 dtype)區(qū)分不同子類的記錄。

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;
}

表結(jié)構(gòu)如下:

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

1-3、注意事項

  • 優(yōu)點:
    查詢效率高(無 JOIN 操作)。
    簡單易用。

  • 缺點:
    數(shù)據(jù)冗余:子類特有字段在非對應記錄中為 NULL。
    字段約束弱:非空約束(NOT NULL)無法用于子類特有字段(因為其他子類記錄中這些字段為 NULL)。

  • 適用場景:繼承層次簡單、子類字段差異小、查詢性能要求高的場景。

二、連接表繼承(Joined Table Inheritance)

2-1、原理

父類獨立表:父類字段存儲在基表中。
子類分表存儲:子類特有字段存儲在獨立的子表中,通過主鍵與基表關聯(lián)(一對一關系)。

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;
}

生成的表結(jié)構(gòu)如下:

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

-- 子表(存儲特有字段 + 關聯(lián)基表主鍵)
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、注意事項

  • 優(yōu)點:
    符合數(shù)據(jù)庫范式,無冗余字段。
    支持子類字段的非空約束。
  • 缺點:
    查詢需要 JOIN 操作,性能較低(尤其層次深時)。
    插入需操作多張表。
  • 適用場景:數(shù)據(jù)結(jié)構(gòu)規(guī)范、子類字段差異大、對冗余敏感的場景。

三、每個具體類一張表(Table Per Class)

3-1、原理

每個具體類獨立成表:每個非抽象子類擁有一張獨立的表,表中包含自身字段 + 所有繼承的父類字段。

抽象父類無表:父類不映射到數(shù)據(jù)庫表(僅用于 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;
}

生成的表結(jié)構(gòu)如下:

-- 父類 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、注意事項

  • 優(yōu)點:
    查詢具體類時效率高(無需 JOIN)。
    無冗余字段。

  • 缺點:
    多態(tài)查詢性能差:查詢父類(如 Shape)需 UNION 所有子表。
    主鍵生成策略需用 TABLE 或 SEQUENCE(避免不同子表主鍵沖突)。

  • 適用場景:多態(tài)查詢少、主要操作具體子類的場景。

四、總結(jié)對比

策略單表繼承(SINGLE_TABLE)連接表繼承(JOINED)每個具體類一張表(TABLE_PER_CLASS)
表數(shù)量1 張N + 1 張(N=子類數(shù))N 張(N=具體子類數(shù))
數(shù)據(jù)冗余高(大量 NULL)
查詢性能?????(無 JOIN)??(需 JOIN)???(具體類快,父類慢)
字段約束弱(不可用 NOT NULL)強(支持約束)強(支持約束)
適用場景簡單繼承、高性能需求結(jié)構(gòu)規(guī)范、減少冗余少用父類查詢、操作具體子類

通用注意事項

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

  • 鑒別器列:單表繼承必須用 @DiscriminatorColumn 和 @DiscriminatorValue。

  • 多態(tài)查詢:連接表繼承和單表繼承對多態(tài)查詢支持較好。

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

總結(jié)

本次總結(jié)的就是 Java 三種繼承映射的使用實現(xiàn), 有需要會繼續(xù)增加功能

到此這篇關于Java繼承映射的三種使用方法的文章就介紹到這了,更多相關Java繼承映射使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 關于Springboot打成JAR包后讀取外部配置文件的問題

    關于Springboot打成JAR包后讀取外部配置文件的問題

    這篇文章主要介紹了關于Springboot打成JAR包后讀取外部配置文件的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Java內(nèi)存模型之happens-before概念詳解

    Java內(nèi)存模型之happens-before概念詳解

    happens-before原則非常重要,它是判斷數(shù)據(jù)是否存在競爭、線程是否安全的主要依據(jù),依靠這個原則,我們解決在并發(fā)環(huán)境下兩操作之間是否可能存在沖突的所有問題。下面我們就一個簡單的例子稍微了解下happens-before知識,感興趣的朋友一起看看吧
    2021-06-06
  • Maven打包編譯出現(xiàn)Fileencodinghasnotbeenset問題的解決方案

    Maven打包編譯出現(xiàn)Fileencodinghasnotbeenset問題的解決方案

    在使用Maven進行項目構(gòu)建時,有時會遇到??File encoding has not been set??的錯誤提示,這個問題通常出現(xiàn)在Maven嘗試編譯Java源文件時,本文將詳細介紹該問題的原因、解決方法以及如何避免類似問題再次發(fā)生,需要的朋友可以參考下
    2025-11-11
  • 淺談MyBatis 如何執(zhí)行一條 SQL語句

    淺談MyBatis 如何執(zhí)行一條 SQL語句

    Mybatis 是 Java 開發(fā)中比較常用的 ORM 框架。在日常工作中,我們都是直接通過 Spring Boot 自動配置,并直接使用,但是卻不知道 Mybatis 是如何執(zhí)行一條 SQL 語句的,下面就一起講解一下
    2021-05-05
  • SpringBoot @PropertySource與@ImportResource有什么區(qū)別

    SpringBoot @PropertySource與@ImportResource有什么區(qū)別

    這篇文章主要介紹了SpringBoot @PropertySource與@ImportResource有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-01-01
  • 用Java實現(xiàn)一個簡單的布隆過濾器

    用Java實現(xiàn)一個簡單的布隆過濾器

    這篇文章主要介紹了用Java實現(xiàn)一個簡單的布隆過濾器,布隆過濾器是1970年由布隆提出的,它實際上是一個很長的二進制向量和一系列隨機映射函數(shù),布隆過濾器可以用于檢索一個元素是否在一個集合中,需要的朋友可以參考下
    2023-12-12
  • SpringBoot項目使用Log4j2+SLF4J構(gòu)建日志的方法步驟

    SpringBoot項目使用Log4j2+SLF4J構(gòu)建日志的方法步驟

    在現(xiàn)代軟件開發(fā)中,日志記錄是一個重要的部分,Spring Boot配置了多種日志框架,這篇文章主要介紹了SpringBoot項目使用Log4j2+SLF4J構(gòu)建日志的方法步驟,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-11-11
  • 詳解Spring ApplicationContext加載過程

    詳解Spring ApplicationContext加載過程

    這篇文章主要介紹了Spring ApplicationContext加載過程的相關資料,幫助大家更好的理解和學習使用spring框架,感興趣的朋友可以了解下
    2021-03-03
  • Jmeter中的timeshift()函數(shù)獲取當前時間進行加減

    Jmeter中的timeshift()函數(shù)獲取當前時間進行加減

    這篇文章主要介紹了Jmeter中的timeshift()函數(shù)獲取當前時間進行加減,TimeShift(格式,日期,移位,語言環(huán)境,變量)可對日期進行移位加減操作,本文給大家詳細講解,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • 如何發(fā)布jar包到maven中央倉庫

    如何發(fā)布jar包到maven中央倉庫

    這篇文章主要介紹了發(fā)布jar包到maven中央倉庫的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12

最新評論

吴忠市| 巴彦县| 林芝县| 北辰区| 凤山县| 建宁县| 凉城县| 富裕县| 平乐县| 蒙城县| 昭通市| 松溪县| 祁连县| 江达县| 奉贤区| 益阳市| 加查县| 泸州市| 施秉县| 辉县市| 胶南市| 娄底市| 井研县| 陵川县| 磐安县| 三台县| 农安县| 昆山市| 祁阳县| 西充县| 盱眙县| 建平县| 奈曼旗| 镶黄旗| 郴州市| 稷山县| 年辖:市辖区| 明光市| 长子县| 红桥区| 吉首市|