Jpa-多表关联-OneToOne

news2024/9/20 17:01:32

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")
    @OneToOne
    private 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_increment
        primary 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_increment
        primary 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.coloradmin.cn/o/1983720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K210烧录固件失败原因

1.检查固件信息,我这里用的是亚博智能提供的canmv固件 2.检查串口有无被占用,我就是因为打开了另一个正点原子的串口接收软件卡这么久 3.你要烧录canmv固件而非maixypy固件 若烧录maixypy要用maixipy来开发 4。可以看看换不同下载方式

辛迪·克劳馥与“惊艳”家人合影,装扮完美协调 幸福满满

我的意思是——辛迪克劳馥拥有一个令人叹为观止的家庭,这真的有什么好奇怪的吗?毕竟,她是世界知名的超级名模,她把基因和颧骨传给了她的孩子,让他们很容易追随她的脚步。所以,当我们看到她最近的家庭照片时…

面试笔记 8.5

面试常见: Jvm,高并发,多线程,数据库,redis,框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…

【ML】multi head self-attention(自注意力机制)

【ML】multi head 自注意力机制self-attention 0. Transformer1. multi head self-attention2. positional encoding3. transform 可以应用的其他领域3.1 语音识别 变体 truncated self-attention3.2 self-attention for image3.3 self-attention v.s. CNN差异3.4 self-attenti…

CSP 2022 提高级第一轮 - CSP/S 2022初试题 程序阅读第三题解析

一、代码查看 1 #include <iostream> 2 #include <algorithm> 3 4 using namespace std; 5 6 const int MAXL 1000; 7 8 int n, k, ans[MAXL]; 9 10 int main(void) 11 { 12 cin >> n >> k; 13 if (!n) cout << 0 <&l…

IO流学习总结

IO流体系 字节流 字节流&#xff1a; 字节输出流:FileOutputStream 程序---写--->文件 字节输入流:FileInputStream 程序<---读---文件 字节输出流(FileOutputStream) Testpublic void testIO01() throws IOException {/*new FileOutputStream文件不存在创建文件父…

最新CSS3纵向菜单的实现

纵向菜单 通过下面例子&#xff0c;你会知道把列表转换成菜单的关键技术 a中的#是URL的占位符可以点击&#xff0c;真正用途中写实际URL <nav class"list1"><ul><li><a href"#">Alternative</a></li><li><…

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…

C与Python Socket性能比较

在比较 C 和 Python 的 Socket 性能时&#xff0c;主要考虑以下几个方面&#xff1a; 运行时性能&#xff1a; C 是编译型语言&#xff0c;生成的机器代码运行速度更快&#xff0c;通常能够提供更低的延迟和更高的吞吐量。Python 是解释型语言&#xff0c;运行时有一定的开销&…

分布式时序数据库TimeLyre 9.2发布:原生多模态、高性能计算、极速时序回放分析

在当今数据驱动的世界中&#xff0c;多模态数据已经成为企业的重要资产。随着数据规模和多样性的不断增加&#xff0c;企业不仅需要高效存储和处理这些数据&#xff0c;更需要从中提取有价值的洞察。工业领域在处理海量设备时序数据的同时&#xff0c;还需要联动分析警报信息、…

K8S资源之NameSpace

作用 隔离资源(默认不隔离网络) 查看所有的NS kubectl get ns创建NS kubectl create ns hello删除NS kubectl delete ns hello

GitHub无法识别Markdown的目录

可以直接下载编译好的二进制文件。 二进制文件 下载下来之后&#xff0c;发现没有后缀名无法识别&#xff0c;实际上这是个exe文件&#xff0c;所以只需要暴力地在后面加上.exe就可以开始愉快使用了。 首先将README.md文档复制到gh-md-toc.exe的根目录下。 接着按住shift键…

Java面试题——第三篇(JVM)

1. 什么情况下会发生栈内存溢出 栈是线程私有的&#xff0c;他的生命周期和线程相同&#xff0c;每个方法在执行的时候都会创建一个栈帧&#xff0c;用来存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程&#xff0c;就对应着一个栈帧…

室内浮毛空气净化器除臭吗?好用的室内浮毛空气净化器推荐

家里养了5只猫&#xff0c;满天飞的猫毛发&#xff0c;随风飘到各个角落&#xff0c;可以说苦不堪言。养了毛孩子之后&#xff0c;家里异味&#xff0c;鼻炎过敏&#xff0c;宠物掉毛真的是太闹心了&#xff01;水杯里&#xff0c;床上都是小猫咪跑酷睡觉留下的毛毛&#xff0c…

公网域名流量禁用详解

公网域名流量禁用是一个涉及网络安全和流量管理的复杂操作&#xff0c;它通常需要根据具体的网络环境和业务需求来实施。以下是一些可能的步骤和考虑因素&#xff1a; 一、明确禁用目标 首先&#xff0c;需要明确禁用公网域名流量的具体目标。这可能包括&#xff1a; 阻止未…

Vue Flow: 高效构建可视化工作流的利器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

DeEcoStudio快捷键设置

例如 打 bgc 快捷键 直接出 .backgroundColor( ) 第一步&#xff1a;点击文件——>设置 第二步&#xff1a;找到编辑器——>实时模板 第三步&#xff1a;点击加号——>点击实时模板 第四步&#xff1a;设置快捷键 第五步&#xff1a;点击变更——>点击全选…

jangow靶机教程

项⽬地址 https://www.vulnhub.com/entry/jangow-101754/ 用vmware需要修改部分配置&#xff0c;才能通过C段扫描成功 1.在系统启动时(⻓按shift键)直到显示以下界⾯ 选择第⼆个&#xff0c;按回⻋ 继续选择第⼆个 2.按e进⼊编辑&#xff0c;进⼊以下界⾯ 删除"recove…

Linux学习笔记:Linux基础知识汇总(个人复习版)

常用命令&#xff1a; 1、ls -a&#xff1a;显示所有文件&#xff08;包括隐藏文件&#xff09;&#xff0c;简洁版 -l&#xff1a;显示所有文件&#xff0c;详细版 -R&#xff1a;显示所有文件以及子目录下文件&#xff0c;简洁版 可以搭配使用。 2、netstat -i&#x…

gitlab-runner /var/run/docker.sock connect permission denied

usermod -aG docker gitlab-runner sudo service docker restart参考&#xff1a;https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3492