Jpa-多表关联-OneToOne
Jpa-多表关联-OneToOne
- 准备
- JoinColumn
- OneToOne属性
- targetEntity
- cascade*
- PERSIST
- MERGE
- REMOVE
- REFRESH
- orphanRemoval
- fetch
- optional
- MappedBy*
OneToOne
在
hibernate
中用于对表与表之间进行维护关联
准备
import com.alibaba.fastjson.JSON;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;@Getter
@Setter
@Entity
@Table(name = "t_user_account", schema = "test")
public class TUserAccount {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Column(name = "msg", length = 50)private String msg;@JoinColumn(name = "user_account", referencedColumnName = "id")@OneToOneprivate TUser user;public String toString() {return JSON.toJSONString(this);}
}
@Entity
@Table(name = "t_user", schema = "test")
@Data
public class TUser {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Long id;@Column(name = "real_name", length = 50)private String realName;//......@OneToOne(mappedBy = "user")private TUserAccount userAccount;}
-- auto-generated definition
create table t_user
(id bigint auto_incrementprimary key,real_name varchar(50) null comment '实际名称',age bigint null,sex varchar(255) null,create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',is_delete tinyint default 0 not null comment '是否删除'
)comment '用户表';-- auto-generated definition
create table t_user_account
(id bigint auto_incrementprimary key,user_account bigint null,msg varchar(50) null
);
JoinColumn
与OneToOne
一起使用的情况下。
JoinColumn
用于定义外键关系。
name
:用当前表那个字段作为目标表的外键,默认是实体名_字段名
referencedColumnName
:与源表用那个字段进行,默认为当前表的主键
OneToOne属性
targetEntity
关联的目标实体类。默认为存储关联的字段的类型。
cascade*
表明那些操作需要级联操作。默认为空。但是查询的时候是会进行级联查询的。
PERSIST
只有插入(INSERT
)操作时进行级联操作 插入主表的同时会插入子表。
当插入操作时,如果没有标注当前PERSIST
方法时则会报错。
// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.PERSIST})@Test
public void testOneToOneInsert(){TUserAccount entity = new TUserAccount();entity.setMsg("INSERT");TUser user = new TUser();user.setRealName("INSERT");entity.setUser(user);// 对主表进行INSERT操作userAccountRepository.save(entity);
}
MERGE
只有更新(UPDATE
)操作时进行级联操作,更新时如果将关联属性修改为null
会把当前表的关联的字段改为null
。默认是不会删除关联表的行数据( 注意这里不会将关联表的行数据给删除,需要删除的话则需要开启orphanRemoval
)。
// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.MERGE})@Test
public void testOneToOneUpdate(){TUserAccount newEntity = new TUserAccount();newEntity.setId(11L);newEntity.setMsg("MERGE");newEntity.setUser(null);userAccountRepository.save(newEntity);
}
进行级联查询后,只对当前表进行
update
操作,将user_account
字段置为null
REMOVE
只有删除(DELETE)操作时进行级联操作,删除主表的同时会把子表也删除
// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.REMOVE})@Test
public void testOneToOneDelete(){userAccountRepository.deleteById(15L);
}
级联查询后,对主表进行删除,再后关联表进行删除。
REFRESH
EntityManager.refresh()
方法用于重新加载实体的状态,从数据库中获取最新的数据,并覆盖当前持久化上下文中的实体状态
orphanRemoval
当进行更新操作时,将关联属性修改为null
,会删除关联的子表数据。默认为false
。
// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.MERGE},orphanRemoval=true)@Test
public void testOneToOneOrphanRemoval(){TUserAccount newEntity = new TUserAccount();newEntity.setId(11L);newEntity.setMsg("MERGE");newEntity.setUser(null);userAccountRepository.save(newEntity);
}
级联查询后,对主表进行更新,将
user_account
改为null
,并删除t_user
的记录。
fetch
EAGER
:立即获取数据(默认)与主表一起查出LAZY
:如果是LAZY
则是当我们使用关联表对象的时候才会去进行查询。注意使用LAZY
时需要@Transactional
中进行使用,因为如果查询完session
关闭了就不能从里面获取数据了。
// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.ALL},orphanRemoval=true,fetch = FetchType.LAZY)@Test
@Transactional
public void testOneToOneFetchLazy(){TUserAccount tUserAccount = userAccountRepository.findById(6L).get();System.out.println("================wait================");System.out.println(tUserAccount.getUser());
}
先只查主表,如果我们没有使用则不会对关联表进行查询,而到我们获取关联表信息的时候再去对关联表进行查询,
optional
是否允许为空,默认是true
。为false
时不能将关联字段设置为null
。表示为非空的关联关系。
MappedBy*
表示关联关系为当前字段类型的的实体
来进行维护,指定的值为目标类型
中的外键字段。这里删除,更新,不会对关联进行操作。
@Test
public void testQueryMappedBy(){TUser tUser = userRepository.findById(7017L).get();System.out.println(tUser);tUser.setUserAccount(null);userRepository.save(tUser);
}
当查询
t_user
的时候也可以把t_user_account
查询出来。对t_user的uesrAccount
的进行操作的时候不会对数据库中的字段进行影响。
相关文章:

Jpa-多表关联-OneToOne
Jpa-多表关联-OneToOne 准备JoinColumnOneToOne属性targetEntitycascade*PERSISTMERGEREMOVEREFRESH orphanRemovalfetchoptionalMappedBy* OneToOne在 hibernate中用于对表与表之间进行维护关联 准备 import com.alibaba.fastjson.JSON; import jakarta.persistence.*; impor…...

zdpy+vue3+onlyoffice文档系统实战上课笔记 20240805
上次 上次计划 1、最近文档表格完善 2、实现登录功能 3、新建文件,复制文件,删除文件 4、其他 目前任务:最近文档表格完善 1、在名称前面,渲染这个文档的图标 2、大小的基本的单位是kb,超过1024kb则换成mb࿰…...
【Linux 从基础到进阶】Linux 内核参数调优
Linux 内核参数调优 引言 内核参数调优是提升 Linux 系统性能和稳定性的重要手段。通过合理配置和优化内核参数,可以显著改善系统资源利用率和响应速度。本文将介绍内核参数的调优方法,并提供适用于 CentOS 和 Ubuntu 系统的具体示例。 1. 内核参数简介 内核参数是控制 L…...

【Java数据结构】---泛型
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 ,Java 欢迎大家访问~ 创作不易,大佬们点赞鼓励下吧~ 文章目录 包装类装箱和拆箱泛型泛型…...

Java Lambda表达式总结(快速上手图解)
Java Lambda表达式总结(快速上手详解)-CSDN博客https://blog.csdn.net/m0_66070037/article/details/140912566?spm1001.2014.3001.5501...
【算法模板】图论:Tarjan算法求割边割点
概念 割边(Bridge 或 Cut Edge) 定义: 在一个无向连通图中,如果删除某条边后,图不再连通(即任意两点之间不能相互到达),则称该边为割边。割边也被称为桥,因为它像桥梁…...

如何在IDEA上使用JDBC编程【保姆级教程】
目录 前言 什么是JDBC编程 本质 使用JDBC编程的优势 JDBC流程 如何在IEDA上使用JDBC JDBC编程 1.创建并初始化数据源 2.与数据库服务器建立连接 3.创建PreparedStatement对象编写sql语句 4.执行SQL语句并处理结果集 executeUpdate executeQuery 5.释放资源 前言 在…...

linux web系统安装常见问题解决,租房系统为案例
Warning: require(): open_basedir restriction in effect. 一、执行文件权限 网站目录下 open_basedir增加执行路径 二、文件夹权限放行 三、安装基础环境 composer install 四、数据合并 php think migrate:run 20200402094148 AdminUser: migrating 20200402094148 A…...

Linux驱动开发—平台总线模型详解
文章目录 1.平台总线介绍1.1平台总线模型的组成部分1.2平台总线模型的优势 2.使用平台总线模型开发驱动2.1注册platform设备2.2注册platform驱动2.3效果演示 1.平台总线介绍 Linux 平台总线模型(Platform Bus Model)是一种设备驱动框架,用于…...
说一下网络层,传输层,数据链路层做什么的,之间的关系?
网络层主要负责为数据包选择最佳路径,将数据从源主机传输到目标主机。它的关键任务包括路由选择、拥塞控制和网络互联等。通过网络层的功能,不同网络之间能够实现通信和数据传输。 传输层的作用是在源端和目的端之间提供可靠或不可靠的端到端的数据传输…...

解锁AI新纪元:Milvus Cloud与Zilliz Cloud的高可用之道
在当今数字化时代,系统的持续稳定运行与数据的即时访问性已成为衡量技术服务质量的关键指标。面对复杂多变的运行环境,包括电力波动、网络故障乃至人为操作失误等不可预见因素,数据库系统的高可用性(High Availability, HA)成为了保障业务连续性的重要基石。特别是在大数据…...
svn安装
579 yum install subversion 580 rpm -qa|grep subversion 581 yum -y install subversion 582 rpm -ql subversion 583 /usr/bin/svnversion --version 584 mkdir /data/svnrepos 585 svnadmin create /data/svnrepos/abc 586 svnadmin create /data/svnrepos/gzss 587 cd…...

【隐私计算篇】混淆电路之深入浅出
入门隐私计算的阶段,一般都会涉及对于混淆电路的学习,这是因为混淆电路是多方安全计算中的基础密码原语,也是隐私保护中重要的技术。为了帮助更好地理解混淆电路的原理,今天对其进行原理以及相关优化手段进行解析和分享。 1. 混淆…...
基于GRU神经网络的微博分类预测
目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 gru的原理 GRU神经网络微博分类 结果分析 展望 参考论文 背影 传统的方法微博分类预测准确率低,为提高精度,本文用gru进行预测 摘要 LSTM原理,GRU原理,MATALB编程gru的微博分类预测 LSTM的基本定义 LSTM是一种含有LST…...

LVS-DR模式集群:案例与概念
DR模式(直接路由) 概念 Direct Routing,简称DR模式采用半开放式的网络结构,与TUN模式的结构类似,但内网服务器并不是分散在各地,而是与调度器位于同一个物理网络负载调度器与内网服务器通过本地网络连接&a…...
拓扑排序:Kahn算法与DFS算法
引言 拓扑排序是有向无环图(DAG)中的一种线性排序,使得对于图中的每一条有向边 ( u \rightarrow v ),顶点 ( u ) 在排序中出现在顶点 ( v ) 之前。本文将详细介绍两种实现拓扑排序的算法:Kahn算法和基于深度优先搜索&…...
图像处理 -- Sobel滤波器的实现原理与使用案例
Sobel滤波器 概述 Sobel滤波器是一种边缘检测方法,用于图像处理和计算机视觉领域。它通过计算图像灰度值的梯度来检测边缘。Sobel滤波器结合了高斯平滑和微分操作,以减少噪声并增强边缘检测效果。 实现原理 Sobel滤波器通过使用两个3x3卷积核&#x…...

机器学习 第10章-降维与度量学习
机器学习 第10章-降维与度量学习 10.1 k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个“邻居”的信息来进行预测。通…...
linux驱动:(7)物理地址到虚拟地址映射
单片机、裸机、linux操控硬件方法 在单片机和裸机中操作硬件是通过指针来对寄存器赋值来进行操控 但对于linux中不能这样,不能直接对物理地址直接修改,因为linux使能了mmu,所以不能直接菜操作物理地址 如果要操作硬件,需要先把…...

浏览器用户文件夹详解 - Preferences(十)
1.Preferences简介 1.1 什么是Preferences文件? Preferences文件是Chromium浏览器中用于存储用户个性化设置和配置的一个重要文件。每当用户在浏览器中更改设置或安装扩展程序时,这些信息都会被记录在Preferences文件中。通过这些记录,浏览…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...