Jpa-多表关联-OneToOne

Jpa-多表关联-OneToOne

    • 准备
    • JoinColumn
    • OneToOne属性
      • targetEntity
      • cascade*
        • PERSIST
        • MERGE
        • REMOVE
        • REFRESH
      • orphanRemoval
      • fetch
      • optional
      • MappedBy*

OneToOnehibernate中用于对表与表之间进行维护关联

准备


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)操作时进行级联操作 插入主表的同时会插入子表。image.png
当插入操作时,如果没有标注当前PERSIST方法时则会报错。
image.png

// 修改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);
}

image.png
image.png

进行级联查询后,只对当前表进行update操作,将user_account字段置为null

REMOVE

只有删除(DELETE)操作时进行级联操作,删除主表的同时会把子表也删除

// 修改TUserAccount.java中的 @OneToOne(cascade = {CascadeType.REMOVE})@Test
public void testOneToOneDelete(){userAccountRepository.deleteById(15L);
}

image.png

级联查询后,对主表进行删除,再后关联表进行删除。

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

image.png

级联查询后,对主表进行更新,将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());
}

image.png

先只查主表,如果我们没有使用则不会对关联表进行查询,而到我们获取关联表信息的时候再去对关联表进行查询,

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

image.png

当查询t_user的时候也可以把t_user_account查询出来。对t_user的uesrAccount进行操作的时候不会对数据库中的字段进行影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392673.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI8-文本检测

文本检测任务是找出图像或视频中的文字位置。不同于目标检测任务,目标检测不仅要解决定位问题,还要 解决目标分类问题。 文本在图像中的表现形式可以视为一种‘目标‘,通用的目标检测的方法也适用于文本检测,从任务本身上来 看: • 目标检测:给定图像或者视频,找出目…

本地部署 faster-whisper

本地部署 faster-whisper 1. 创建虚拟环境2. 安装依赖模块3. 创建 Web UI4. 启动 Web UI5. 访问 Web UI 1. 创建虚拟环境 conda create -n faster-whisper python3.11 -y conda activate faster-whisper2. 安装依赖模块 pip install torch2.2.2 torchvision0.17.2 torchaudio…

bilibili实习生一面0625

OSI七层模型 物理层:将帧中的比特传送到下一个节点(比特) 数据链路层:将数据包装成帧并传送到路径上下一个节点,将相邻节点间不可靠的物理链路变成可靠的逻辑链路(帧) 网络层:路由寻…

Qt 5.14安装(配置MSVC 2017)

Qt 5.14安装(配置MSVC 2017) 记录一下自己安装配置Qt的步骤。 我需要安装Qt,并使用MSVC编译,所以才写了这篇文章。 一、环境 操作系统:windows 11 (64位) Qt:Qt 5.14.2 vs&…

怎么读取FRM、MYD、MYI数据文件

一、介绍frm、MYD、MYI文件 在MySQL中,使用MyISAM存储引擎时,数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息,字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD(MYData&#x…

[米联客-安路飞龙DR1-FPSOC] UDP通信篇连载-04 IP层程序设计

软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…

学习笔记-MYSQL 事务

目录 一、什么是事务? 二、事务的四个特征(ACID)【面试常考项】 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability&#x…

Linux-理解shell

文章目录 5. 理解shell5.1 shell的类型5.2 交互shell和系统默认shell5.3 安装zsh shell程序5.4 shell的父子关系5.5 命令列表5.6 命令分组5.7 使用命令分组创建子shell5.8 子shell用法5.9 shell的非内建命令和内建命令5.9.1 非内建命令5.9.2 内建命令5.9.3 history和alias命令介…

AI9-文本识别

本章主要介绍文本识别算法的理论知识,包括背景介绍、算法分类和部分经典论文思路。 通过本章的学习,你可以掌握: 1. 文本识别的目标 2. 文本识别算法的分类 3. 各类算法的典型思想 1 背景介绍 文本识别是OCR(Optical Character Recognition)的一个子任务,其任务为识别一个…

基于 Redis 的分布式信号量 Spring Boot 集成 Redisson 使用 Semaphore 控制并发访问数量

目录 前言 pom yml Controller 演示 注意 前言 工作中开发过一个服务,这里记作A服务,主要功能是配置,部署以及调用云函数。其中配置云函数的功能里,有一个配置项是并发数,意思是同一时间最多能有多少个请求调用…

【MATLAB源码】数学建模基础教程(2)--层次分析法(评价类算法)

系列文章目录在最后面,各位同仁感兴趣可以看看! 层次分析法 引言一、层次分析法的特点二、模型的建立求解过程 (1)问题的提出:实际问题的转化(2)建立层次结构模型(3)构造判断(成对比较)矩阵(4)一致性检验:三、层次分析法的优点与…

Codeforces Round 871 (Div. 4)(A~H)

比赛链接 Dashboard - Codeforces Round 871 (Div. 4) - Codeforces A. Love Story 找到与codeforces 有多少个不同的字符。 #include<bits/stdc.h> #define int long long #define TEST int T; cin >> T; while (T--) #define ios ios::sync_with_stdio(fals…

前端常用的性能优化方案

目录 性能分析工具lighthouseWebpack Bundle分析 开发阶段按需引入路由懒加载 打包阶段打包配置减少包体积配置压缩分包 资源预加载/预请求 部署阶段开启http2静态资源缓存gzip压缩 性能优化主要在三个阶段进行&#xff1a;开发阶段、开发结束后的打包阶段、项目部署上线阶段 首…

提升生产效率:APS高级计划排程系统在车间工序级排程的革命性应用

在制造业的数字化转型浪潮中&#xff0c;APS高级计划排程系统以凭借自身卓越的排程运算能力和应用灵活性&#xff0c;已经成为中大型制造业提升生产效率的关键工具。APS系统的介入&#xff0c;打通了传统ERP和MES等各类业务系统运营平台&#xff0c;并且通过产能均衡规划&#…

为什么我3d模型选择面选不到?---模大狮模型网

在展览3D模型设计行业中&#xff0c;设计师常常面临诸多技术挑战&#xff0c;其中之一是在模型编辑过程中遇到选择面的困难。这不仅影响了设计工作效率&#xff0c;还可能影响最终作品的质量和展示效果。本文将探讨在3D模型设计中为何会遇到“为什么我3D模型选择面选不到?”这…

【MySQL进阶篇】管理

1、系统数据库 MySQL数据库安装完成之后&#xff0c;自带以下四个数据库&#xff0c;具体作用如下&#xff1a; 数据库含义mysql存储MySQL服务器正常运行所需要的各种信息&#xff08;时区、主从、用户、权限等&#xff09;information_schema提供了访问数据库元数据的各种表…

实战OpenCV之环境安装与配置

OpenCV是什么 OpenCV&#xff0c;英文全称为Open Source Computer Vision Library&#xff0c;是一个开源的计算机视觉和机器学习软件库。它设计用于提供一系列功能强大的算法&#xff0c;以帮助开发者处理图像和视频数据&#xff0c;实现各种视觉任务&#xff0c;包括&#xf…

.NET内网实战:模拟Installer关闭Defender

01基本介绍 02编码实现 原理上通过Windows API函数将当前进程的权限提升至TrustedInstaller&#xff0c;从而实现了对Windows Defender服务的控制。通常可以利用Windows API中的OpenSCManager、OpenProcessToken、ImpersonateLoggedOnUser以及ControlService等函数协同工作&am…

从干涉实验、化学反应到晶体管的科学之旅 - 《量子宇宙》读后感

在《量子宇宙》这本书中&#xff0c;作者没有讲述历史和发现的故事&#xff0c;而是从头到尾用公式推导来展示宇宙和现代物理学的壮美。 量子理论处理的是概率&#xff0c;而不是确定性。大自然在某些方面本质上就是由或然率支配的。计算粒子出现的概率是我们能做到的极限。 …

渗透小游戏,各个关卡的渗透实例---步骤简单(含代码)

文章目录 Less-1Less-2Less-5updatexml报错注入&#xff1a; Less-6Less-7Less-8Less-9Less-11Less-13Less-15 Less-1 首先&#xff0c;可以看见该界面&#xff0c;该关卡主要是SQL注入&#xff0c;由于对用户的输入没有做过滤&#xff0c;使查询语句进入到了数据库中&#xff…