JPA实现存储实体类型信息
目录
- 背景介绍
- 概念说明
- @DiscriminatorValue 注解:
- @DiscriminatorColumn 注解:
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注解:
- 实现方式
- 父类
- 子类
- 执行效果
- 总结提升
背景介绍
在我们项目开发的过程中经常会用到继承和多态。当我们向数据库中保存数据的时候保存的都是子类的信息,用了一个字段>来区分数据是什么类型的,也就是说当前这条数据是哪个子类的。但是我们从数据库中查询数据的时候往往不清楚查询出来的是哪个子类类型的数据,所以统一使用父类类型的对象去接收。这样当我们使用从数据库中获取出来的对象的时候就是父类类型。当使用这个对象去执行方法的时候就无法达到多态的效果。对此我们可以使用JPA给我们提供的注解来解决这个问题。
概念说明
@DiscriminatorValue、@DiscriminatorColumn 和 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 这三个注解是在JPA中用于处理继承关系的。
@DiscriminatorValue 注解:
「作用 」:用于指定实体类在继承关系中的具体子类的标识值。
「使用 」:在子类的类级别上使用 @DiscriminatorValue 注解,并传入一个字符串参数,表示该子类在数据库中的标识值。
「示例 」:假设有一个父类 Animal,有两个子类 Cat 和 Dog,可以在 Cat 类上使用 @DiscriminatorValue(“cat”) 注解,表示 Cat 类在数据库中的标识值为 “cat”。
@DiscriminatorColumn 注解:
「作用 」:用于指定父类在数据库中存储子类类型信息的列。
「使用 」:在父类的类级别上使用 @DiscriminatorColumn 注解,可以指定列的名称和类型。
「示例 」:在 Animal 类上使用 @DiscriminatorColumn 注解,可以指定一个名为 “animal_type” 的列,用于存储子类的类型信息。
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注解:
「作用 」:用于指定继承关系的策略,将多个子类的数据存储在同一个表中。
「使用 」:在父类的类级别上使用 @Inheritance 注解,并传入一个 InheritanceType.SINGLE_TABLE 参数。
「示例 」:在 Animal 类上使用 @Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注解,表示使用单表继承策略,将父类和所有子类的数据存储在同一个表中。
实现方式
父类
在父类中添加@Inheritance(strategy = InheritanceType.SINGLE_TABLE)、
@DiscriminatorColumn(name = “GrainType”)和@Entity。@Inheritance注解中传入的参数是指将父类和所有的子类都在一张表中。@DiscriminatorColumn注解中传入的参数是指使用那个属性来标识存储子类类型的信息。@Entity注解是标识这个类是一个实体类。
@Service
@Entity
@Table(name = "ContentGrain")
/**将父类和所有子类的属性映射到同一张数据表中。通过GrainType来区分不同的实体类型。*/
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "GrainType")
public class ContentGrain implements Serializable {
父类中会有一个grainType字段用来标识是那个子类类型。

子类
使用@DiscriminatorValue注解用来指定实体类在继承关系中的具体子类的标识值。
@Entity
@Service
@DiscriminatorValue("challenge")
public class Challenge extends ContentGrain implements Serializable {
@Entity
@Service
@DiscriminatorValue("topic")
public class Topic extends ContentGrain implements Serializable {
执行效果

总结提升
通过以上注解的使用,可以实现将父类和子类的数据存储在同一个表中,并在查询时正确还原子类的对象。
@DiscriminatorValue 注解用于指定子类的标识值,@DiscriminatorColumn 注解用于指定存储子类类型信息的列,@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 注解用于指定继承关系的策略,将多个子类的数据存储在同一个表中。
相关文章:
JPA实现存储实体类型信息
本文已收录于专栏 《Java》 目录 背景介绍概念说明DiscriminatorValue 注解:DiscriminatorColumn 注解:Inheritance(strategy InheritanceType.SINGLE_TABLE) 注解: 实现方式父类子类执行效果 总结提升 背景介绍 在我们项目开发的过程中经常…...
阿里云快速部署开发环境 (Apache + Mysql8.0+Redis7.0.x)
本文章的内容截取于云服务器管理控制台提供的安装步骤,再整合前人思路而成,文章末端会提供原文连接 ApacheMysql 8.0部署MySQL数据库(Linux)步骤一:安装MySQL步骤二:配置MySQL步骤三:远程访问My…...
语音秘书:让录音转文字识别软件成为你的智能工作助手
每当在需要写文章的深夜,我的思绪经常跟不上我的笔,即便是说出来用录音机录下,再书写出来,也需要耗费大量时间。这个困扰了我很久的问题终于有了解决的办法,那就是录音转文字软件。它像个语言魔术师,将我所…...
【腾讯云 Cloud Studio 实战训练营】用于编写、运行和调试代码的云 IDE泰裤辣
文章目录 一、引言✉️二、什么是腾讯云 Cloud Studio🔍三、Cloud Studio优点和功能🌈四、Cloud Studio初体验(注册篇)🎆五、Cloud Studio实战演练(实战篇)🔬1. 初始化工作空间2. 安…...
[C#] 简单的俄罗斯方块实现
一个控制台俄罗斯方块游戏的简单实现. 已在 github.com/SlimeNull/Tetris 开源. 思路 很简单, 一个二维数组存储当前游戏的方块地图, 用 bool 即可, true 表示当前块被填充, false 表示没有. 然后, 抽一个 “形状” 类, 形状表示当前玩家正在操作的一个形状, 例如方块, 直线…...
postman官网下载安装登录详细教程
目录 一、介绍 二、官网下载 三、安装 四、注册登录postman账号(不注册也可以) postman注册登录和不注册登录的使用区别 五、关于汉化的说明 一、介绍 简单来说:是一款前后端都用来测试接口的工具。 展开来说:Postman 是一个…...
(贪心) 剑指 Offer 14- I. 剪绳子 ——【Leetcode每日一题】
❓剑指 Offer 14- I. 剪绳子 难度:中等 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n > 1 并且 m > 1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m…...
如何将Linux上的cpolar内网穿透设置成 - > 开机自启动
如何将Linux上的cpolar内网穿透设置成 - > 开机自启动 文章目录 如何将Linux上的cpolar内网穿透设置成 - > 开机自启动前言一、进入命令行模式二、输入token码三、输入内网穿透命令 前言 我们将cpolar安装到了Ubuntu系统上,并通过web-UI界面对cpolar的功能有…...
50.两数之和(力扣)
目录 问题描述 核心代码解决 代码思想 时间复杂度和空间复杂度 问题描述 给定一个整数数组 和一个整数目标值 ,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。numstarget 你可以假设每种输入只会对应一个答案。但是&am…...
k8s基础
k8s基础 文章目录 k8s基础一、k8s组件二、k8s组件作用1.master节点2.worker node节点 三、K8S创建Pod的工作流程?四、K8S资源对象1.Pod2.Pod控制器3.service && ingress 五、K8S资源配置信息六、K8s部署1.K8S二进制部署2.K8S kubeadm搭建 七、K8s网络八、K8…...
【自然语言处理】大模型高效微调:PEFT 使用案例
文章目录 一、PEFT介绍二、PEFT 使用2.1 PeftConfig2.2 PeftModel2.3 保存和加载模型 三、PEFT支持任务3.1 Models support matrix3.1.1 Causal Language Modeling3.1.2 Conditional Generation3.1.3 Sequence Classification3.1.4 Token Classification3.1.5 Text-to-Image Ge…...
FFmpeg将编码后数据保存成mp4
以下测试代码实现的功能是:持续从内存块中获取原始数据,然后依次进行解码、编码、最后保存成mp4视频文件。 可保存成单个视频文件,也可指定每个视频文件的总帧数,保存多个视频文件。 为了便于查看和修改,这里将可独立的…...
设置VsCode 将打开的多个文件分行(栏)排列,实现全部显示
目录 1. 前言 2. 设置VsCode 多文件分行(栏)排列显示 1. 前言 主流编程IDE几乎都有排列切换选择所要查看的文件功能,如下为Visual Studio 2022的该功能界面: 图 1 图 2 当在Visual Studio 2022打开很多文件时,可以按照图1、图2所示找到自…...
Vue.js2+Cesium1.103.0 六、标绘与测量
Vue.js2Cesium1.103.0 六、标绘与测量 点,线,面的绘制,可实时编辑图形,点击折线或多边形边的中心点,可进行添加线段移动顶点位置等操作,并同时计算出点的经纬度,折线的距离和多边形的面积。 De…...
【redis 延时队列】使用go-redis的list做异步,生产消费者模式
分享一个用到的,使用go-redis的list做异步,生产消费者模式,接着再用 go 协程去检测队列里是否有东西去消费 如果队列为空,就会一直pop,空轮询导致 cpu 资源浪费和redis qps无效升高,所以可以通过 time.Sec…...
激光焊接塑料多点测试全画面穿透率测试仪
工程塑料由于其具有高比强度、电绝缘性、耐磨性、耐腐蚀性等优点,已广泛应用于各个重要领域。另一方面,工程塑料还具有良好的焊接性,是制成复合材料的基体材料的优良选择,因此目前已成为国内外新型复合材料的研究热点。 工程塑料…...
用 Uno 当烧录器给 atmega328 烧录 bootloader
用 Uno 当烧录器给 atmega328 烧录 bootloader date: 2023-8-10 https://backmountaindevil.github.io/#/hackaday/arduino/isp 引脚接线 把两个板子的 11(MOSI)、12(MISO)、13(SCK)、5V、GND 两两相连,还要把 Uno(烧录器)的 10 接到atmeg…...
spring boot策略模式实用: 告警模块为例
spring boot策略模式实用: 告警模块 0 涉及知识点 策略模式, 模板方法, 代理, 多态, 反射 1 需求概括 场景: 每隔一段时间, 会获取设备运行数据, 如通过温湿度计获取到当前环境温湿度;需求: 对获取回来的进行分析, 超过配置的阈值需要产生对应的告警 2 方案设计 告警的类…...
Camunda 7.x 系列【10】使用 Rest API 运行流程实例
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 前言2. 官方接口文档3. 本地接口文档3.1 Postman3.2 Camunda Platform Run Swagger3.3 S…...
Python-OpenCV中的图像处理-边缘检测
Python-OpenCV中的图像处理-边缘检测 边缘检测Canny算子 边缘检测Canny算子 Canny 边缘检测是一种非常流行的边缘检测算法,是 John F.Canny 在 1986 年提出的。它是一个有很多步构成的算法:噪声去除、计算图像梯度、非极大值抑制、滞后阀值等。 Canny(i…...
从零开始:ArcGIS Pro二次开发环境搭建与首个模块加载项实战
1. 环境准备:从零搭建ArcGIS Pro开发环境 第一次接触ArcGIS Pro二次开发时,我花了整整两天时间才把环境配置好。现在回想起来,其实只要抓住几个关键点就能避开那些坑。首先需要确认的是软件版本匹配问题——这是新手最容易翻车的地方。根据我…...
STM32WLE5CCU6实战:从官方例程到第三方模块的PingPong通信移植详解
1. STM32WLE5CCU6硬件平台与PingPong通信基础 STM32WLE5CCU6是ST推出的Sub-1GHz无线微控制器,集成了Cortex-M4内核和LoRa射频模块。与常见的NUCLEO-WL55JC开发板不同,实际项目中我们更常遇到采用QFN48封装的独立芯片方案,比如搭配亿佰特E77这…...
Three.js 3D热力图实现全解析(从原理到实战)
1. 3D热力图的核心原理与实现思路 第一次接触3D热力图时,我也被那些酷炫的立体数据可视化效果惊艳到了。这种技术本质上是通过颜色和高度两个维度来呈现数据密度分布,比传统的2D热力图多了Z轴信息。在Three.js中实现这个效果,关键要理解三个核…...
别再傻傻分不清!一张图看懂RFID、NFC和智能卡的区别与联系
1. 从门禁到移动支付:RFID、NFC与智能卡技术全解析 每天清晨,当您用门禁卡刷开小区大门,用手机在便利店完成无接触支付,或是用公交卡快速通过地铁闸机时,背后都隐藏着一系列精妙的无线通信技术。这些看似简单的"刷…...
使用Microsoft Agent Framework构建C# AI代理雍
简介 langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用,和模型的问答 Chain链的组成 根据查阅的资料,langchain的chain链结构如下: $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...
LLM安全对齐工程白皮书(工业级落地版):覆盖92%企业场景的12项强制校验清单
第一章:LLM安全对齐工程化的核心范式与工业落地挑战 2026奇点智能技术大会(https://ml-summit.org) 大型语言模型的安全对齐已从实验室研究阶段迈入规模化工程实践的关键转折点。当前主流工业场景中,对齐不再仅依赖RLHF单点优化,而是演进为覆…...
Android权限延时动态声明机制和可行的解决方案
Android权限延时动态声明机制和可行的解决方案核心结论Android系统权限无法真正做到"运行时动态声明",但可以通过以下方案实现类似效果:方案一:动态功能模块(官方推荐)原理说明┌─────────────…...
clickhouse可以表关联吗
ClickHouse 完全支持表关联(JOIN),但语法和性能特性与传统数据库有所不同。ClickHouse JOIN 类型表格JOIN 类型语法说明INNER JOINSELECT ... FROM a INNER JOIN b ON a.id b.id标准内连接LEFT JOINSELECT ... FROM a LEFT JOIN b ON a.id …...
Razer-macos核心组件深度剖析:设备管理器与动画系统
Razer-macos核心组件深度剖析:设备管理器与动画系统 【免费下载链接】razer-macos Color effects manager for Razer devices for macOS. Supports High Sierra (10.13) to Monterey (12.0). Made by the community, based on openrazer. 项目地址: https://gitco…...
Qwen3-14B-INT4-AWQ赋能运维:智能日志分析与故障预警实战
Qwen3-14B-INT4-AWQ赋能运维:智能日志分析与故障预警实战 1. 运维人员的日常困境 凌晨3点,某电商平台的运维工程师小王被刺耳的告警铃声惊醒。服务器CPU使用率飙升到98%,但查看监控系统却找不到明确原因。他不得不手动翻阅数GB的日志文件&a…...
