Hibernate框架【五】——基本映射——多对多映射

news2024/11/17 14:39:58

系列文章目录

Hibernate框架【三】——基本映射——一对一映射
Hibernate框架【四】——基本映射——多对一和一对多映射


基本映射——多对多映射

  • 系列文章目录
  • 前言
  • 一、多对多映射是什么?
  • 二、hibernate多对多关联映射(单向)
    • 1.实体结构
    • 2.示意图
    • 3.对应的实体xml配置文件
    • 4.生成的表结构
    • 5.核心代码
      • 1.插入数据
      • 2.查询数据
  • 三、hibernate多对多关联映射(双向)
    • 1.实体结构
    • 2.对应实体的xml配置文件
    • 3.生成的表结构
    • 4.核心代码
      • 1.插入数据
      • 2.查询数据(先查User)
      • 3.查询数据(先查Role)
  • 四、总结


前言

由于公司项目上进行面向对象的架构设计对于ORM部分使用的是Spring Data JPA框架。将ORM完全交给Spring Data JPA框架,而Hibernate是Spring Data JPA的实现方式之一,通过对HIbernate框架的学习能够更好的理解ORM框架,以及Spring Data JPA框架。
下面的博客是对于Hibernate框架中的基本映射中的一对一映射进行的实践,总结的并不全面,旨在对于一对一映射关系有一个宏观了解并能够进行基本运用。


一、多对多映射是什么?

在Hibernate中,多对多映射表示多个实体之间的多对多关系,其中一个实体可以与多个另一实体相关联,并且每个另一实体也可以与多个该实体相关联。
在多对多映射中,需要创建一个中间表(关联表)来存储实体之间的关联关系。该中间表通常包含两个外键列,分别指向参与关联的两个实体的主键。
当然多对多映射关系,也分为单向关联和双向关联。

二、hibernate多对多关联映射(单向)

案例:现在有两个实体User实体和Role,分别表现出多对多的关系,一个用户可以有多个角色,一个角色可以包含多个用户。

1.实体结构

package com.wangwei.hibernate;

import java.util.Set;

public class User {
    
    private int id;
    
    private String name;

    private Set roles;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set getRoles() {
        return roles;
    }

    public void setRoles(Set roles) {
        this.roles = roles;
    }
}

package com.wangwei.hibernate;

public class Role {

    private int id;
    
    private String name;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

2.示意图

在这里插入图片描述

3.对应的实体xml配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wangwei.hibernate.Role" table="t_role">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wangwei.hibernate.User" table="t_user">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="roles" table="t_user_role">
            <key column="user_id"/>
            <many-to-many class="com.wangwei.hibernate.Role" column="role_id" />    
        </set>
    </class>
</hibernate-mapping>

4.生成的表结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.核心代码

1.插入数据

public class Many2ManyTest extends TestCase {

    public void testSave1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
            Role r1 = new Role();
            r1.setName("数据录入人员");
            session.save(r1);
            
            Role r2 = new Role();
            r2.setName("商务主管");
            session.save(r2);
            
            Role r3 = new Role();
            r3.setName("商务经理");
            session.save(r3);
            
            Role r4 = new Role();
            r4.setName("项目会计");
            session.save(r4);
            
            User u1 = new User();
            u1.setName("张三");
            Set u1Roles = new HashSet();
            u1Roles.add(r1);
            u1Roles.add(r2);
            u1.setRoles(u1Roles);
            session.save(u1);
            
            User u2 = new User();
            u2.setName("李四");
            Set u2Roles = new HashSet();
            u2Roles.add(r1);
            u2Roles.add(r2);
            u2Roles.add(r3);
            u2.setRoles(u2Roles);
            session.save(u2);
            
            User u3 = new User();
            u3.setName("王五");
            Set u3Roles = new HashSet();
            u3Roles.add(r3);
            u3Roles.add(r4);
            u3.setRoles(u3Roles);
            session.save(u3);
            
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }    

发出的SQL语句
在这里插入图片描述
数据库中的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.查询数据

public void testLoad1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            User user = (User)session.load(User.class, 2);
            System.out.println(user.getName());
            for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
                Role role = (Role)iter.next();
                System.out.println(role.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }        

发出的sql语句和打印的结果
在这里插入图片描述

三、hibernate多对多关联映射(双向)

1.实体结构

package com.wangwei.hibernate;

import java.util.Set;

public class Role {

    private int id;
    
    private String name;
    
    private Set User;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set getUser() {
        return User;
    }

    public void setUser(Set user) {
        User = user;
    }
    
}

package com.wangwei.hibernate;

import java.util.Set;

public class User {
    
    private int id;
    
    private String name;

    private Set roles;
    
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set getRoles() {
        return roles;
    }

    public void setRoles(Set roles) {
        this.roles = roles;
    }
}

2.对应实体的xml配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wangwei.hibernate.Role" table="t_role">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="user" table="t_user_role">
            <key column="role_id" not-null="true"/>
            <many-to-many class="com.wangwei.hibernate.User" column="user_id"/>
        </set>
    </class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.wangwei.hibernate.User" table="t_user">
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <set name="roles" table="t_user_role">
            <key column="user_id"/>
            <many-to-many class="com.wangwei.hibernate.Role" column="role_id" />    
        </set>
    </class>
</hibernate-mapping>

注意事项:

  • 生成的中间表名称必须一样
  • 生成的中间表中的字段必须一样

3.生成的表结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.核心代码

1.插入数据

public void testSave1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            
            Role r1 = new Role();
            r1.setName("数据录入人员");
            session.save(r1);
            
            Role r2 = new Role();
            r2.setName("商务主管");
            session.save(r2);
            
            Role r3 = new Role();
            r3.setName("商务经理");
            session.save(r3);
            
            Role r4 = new Role();
            r4.setName("项目会计");
            session.save(r4);
            
            User u1 = new User();
            u1.setName("张三");
            Set u1Roles = new HashSet();
            u1Roles.add(r1);
            u1Roles.add(r2);
            u1.setRoles(u1Roles);
            session.save(u1);
            
            User u2 = new User();
            u2.setName("李四");
            Set u2Roles = new HashSet();
            u2Roles.add(r1);
            u2Roles.add(r2);
            u2Roles.add(r3);
            u2.setRoles(u2Roles);
            session.save(u2);
            
            User u3 = new User();
            u3.setName("王五");
            Set u3Roles = new HashSet();
            u3Roles.add(r3);
            u3Roles.add(r4);
            u3.setRoles(u3Roles);
            session.save(u3);
            
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }    

生成的sql语句
在这里插入图片描述
表中的数据
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.查询数据(先查User)

public void testLoad1() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            User user = (User)session.load(User.class, 2);
            System.out.println(user.getName());
            for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
                Role role = (Role)iter.next();
                System.out.println(role.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }        

发出的sql语句和打印的结果

在这里插入图片描述

3.查询数据(先查Role)

public void testLoad2() {
        Session session = null;
        try {
            session = HibernateUtils.getSession();
            session.beginTransaction();
            Role role = (Role)session.load(Role.class, 1);
            System.out.println(role.getName());
            for (Iterator iter=role.getUser().iterator(); iter.hasNext();) {
                User user = (User)iter.next();
                System.out.println(user.getName());
            }
            session.getTransaction().commit();
        }catch(Exception e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }finally {
            HibernateUtils.closeSession(session);
        }
    }        

发出的sql语句和结果
在这里插入图片描述

四、总结

如何选择多对多的单向关联还是多项关联。主要取决于实际的业务需要。
1.如果只需要从一个实体导航到另一个实体,而无需反向导航,那么使用单向关联更为合适。
2.如果不需要再两个实体上进行关系的维护,添加、删除、更新等,那么单向关联更合适。
3.维护上:单向关联不会引入额外的的关系

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

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

相关文章

Flink Table/Sql自定义Kudu Sink实战(其它Sink可参考)

目录 1. 背景2. 原理3. 通过Trino创建Kudu表4. FlinkKuduTableSinkProject项目4.1 pom.xml4.2 FlinkKuduTableSinkFactory.scala4.3 META-INF/services4.4 FlinkKuduTableSinkTest.scala测试文件 5. 查看Kudu表数据 1. 背景 使用第三方的org.apache.bahir flink-connector-ku…

​2023年湖北企业人力资源管理师报考条件是什么?启程别告诉你

2023年湖北企业人力资源管理师报考条件是什么&#xff1f;启程别告诉你 2019年国家就取消了企业人力资源管理师国家职业资格考试&#xff0c;现在是改革为职业技能等级认证&#xff0c;由人社部监管的第三方组织机构组织考试和颁发证书&#xff0c;那改革后的企业人力资源管理师…

创建镜像-dockerfile

Docker 镜像的创建 创建镜像有三种方法&#xff1a; 1.基于已有镜像创建、 2.基于本地模板创建 3.基于Dockerfile创建。 基于现有镜像创建 首先启动一个镜像&#xff0c;在容器里做修改 docker create -it centos:7 /bin/bash然后将修改后的容器提交为新的镜像&#xff…

在JavaScript中的数据结构(队列)

文章目录 什么是队列&#xff1f;创建队列新建队列队列可用的方法队列添加元素队列移除元素队列查看元素查看队列头元素检查队列是否为空检查队列的长度打印队列元素 完整队列代码 循环队列优先队列是什么&#xff1f;总结 什么是队列&#xff1f; 当我们在浏览器中打开新标签…

【1483. 树节点的第 K 个祖先】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个…

pyecharts使用案例二——全国疫情可视化地图开发

代码 import json from pyecharts.charts import Map from pyecharts.options import *f open("./疫情.txt", "r", encoding"UTF-8") data f.read()f.close()# 取到各省份数据 # 将json字符串转为python字典,反序列化 data_dict json.loads(…

vue3-实战-07-管理后台-属性管理模块开发

目录 1-需求原型分析 2-三级分类全局组件封装 2.1-三级分类组件请求接口和数据类型封装 2.2-组件获取数据渲染数据 3-属性管理列表开发 3.1-请求接口和数据类型封装 3.2-获取数据渲染数据 4-新增编辑属性 4.1-需求原型分析 4.2-新增编辑接口封装和数据类型定义 4.3-…

IDEA在Maven settings.xml失效的情况下反编译代码

在我们日常的工作中有时候会遇到需要调试别人的代码的问题&#xff0c;这个时候别人往往会给你一个jar包&#xff0c;这个包里面的代码都是经过编译的&#xff0c;点击打开函数以后都是后缀是.class的文件&#xff0c;我们调试起来非常不方便&#xff0c;这个时候如果我们想要下…

Vue中如何进行剪贴板操作?

Vue中如何进行剪贴板操作&#xff1f; 在Web应用程序中&#xff0c;剪贴板&#xff08;Clipboard&#xff09;操作是非常常见的操作之一。Vue.js是一款流行的JavaScript框架&#xff0c;它提供了一些有用的工具来处理DOM元素和用户界面。本文将介绍如何在Vue.js中使用剪贴板操…

行业拐点已至?解码装备制造企业四大转型方向!

当前&#xff0c;国内外经济形势复杂严峻&#xff0c;不稳定、不确定性因素增多。装备制造业企业面对行业增速放缓、内外部环境变化的挑战&#xff0c;叠加国家政策的鼓励与引导&#xff0c;数字化转型已经成为装备制造企业的迫切需求。 01 装备制造业发展现状&#xff08;SWOT…

抛售股票提现15亿美元救急,英特尔「下手」Mobileye这颗「摇钱树」

本周&#xff0c;全球半导体巨头英特尔宣布&#xff0c;将出售旗下上市公司Mobileye的部分股权&#xff0c;预计价值约15亿美元&#xff0c;股份将从目前的99.3%降至约98.7%。截止昨天收盘&#xff0c;Mobileye的最新市值约为339.4亿美元&#xff08;同期&#xff0c;英特尔市值…

VSCode连接远程服务器上docker容器进行代码调试

VSCode连接远程服务器上docker容器进行代码调试 1、本教程默认已经在本地安装完毕VSCode&#xff0c;并且安装ssh2、本教程默认已经在服务器端安装完毕docker与nvidia-docker、ssh服务并自动启动、且容器内安装anaconda3、服务器端创建docker容器&#xff0c;并增加端口映射&am…

【JS】时间格式转化相差8小时的原因

文章目录 时间类型UTCGMTCST 出现时间转化中相差8小时的原因 时间类型 UTC 协调世界时&#xff0c;又称世界统一时间、世界标准时间、国际协调时间&#xff0c;简称UTC&#xff08;Coordinated Universal Time&#xff09; UTC8即为北京时间&#xff0c;目前一般认为UTC与GMT…

AIGC|我让AI来写今年高考作文

作者&#xff1a;谢凯 | 神州数码云基地-需求分析师 目录 一、人工智能究竟强在哪 //以ChatGPT为例&#xff0c;人工智能其优势何在&#xff1f; 二、BingAI如何处理高考作文 三、总结 一、人工智能究竟强在哪 随着ChatGPT&#xff08;Chat Generative Pre-trained Transfo…

Vue CLI在 CommonJS 模块中不支持顶级 await 语法的解决办法

这是因为默认情况下&#xff0c;Vue CLI 会将你的代码转换为 CommonJS 模块&#xff0c;而在 CommonJS 模块中不支持顶级 await 语法。 在vue3项目的utils里面的js文件中写export全局调用方法时&#xff0c;打包依赖报错&#xff1b; 解决办法: 新增依赖vue/cli-plugin-top-…

iToolab UnlockGo for Mac,iOS设备解锁工具

iToolab UnlockGo是一款专业的 iPhone/iPad 解锁工具&#xff0c;可以帮助用户解除 iOS 设备的各种锁定&#xff0c;包括屏幕密码、指纹密码、Face ID 等。以下是 iToolab UnlockGo 的一些主要特点&#xff1a; 针对多种锁定类型&#xff1a;iToolab UnlockGo 可以解除多种 iO…

对数组的“reg [7:0] a_tmp[32:0]”理解

数组 在verilog中&#xff0c;对数组reg [7:0] a_tmp[32:0]进行操作时&#xff0c;分不清楚先对[32:0]进行操作还是先对 [7:0]进行操作&#xff0c;为此进行下面的实验。进一步加深对数组的理解。 实验1&#xff1a; reg [7:0] a_tmp[32:0];遍历的方式&#xff1a; integer …

架构师日记-从技术角度揭露电商大促备战的奥秘 | 京东云技术团队

一 背景 今年的618大促已经如期而至&#xff0c;接下来我会从技术的角度&#xff0c;跟大家聊聊大促备战的底层逻辑和实战方案&#xff0c;希望能够解答大家心中的一些疑惑。 首先&#xff0c;618大促为什么如此重要呢&#xff1f;先从数据的角度简单做一下分析&#xff0c;以…

Arcgis根据经纬度获得点的地理信息/行政区划信息

步骤可以总结为&#xff1a; 导入shp文件&#xff08;面数据&#xff0c;也就是行政区划的依据&#xff09; 导入栅格数据 将栅格数据落入到坐标系中 将导入的栅格点导出为shp图层 栅格点与面数据连接对齐 导出结果 1、导入shp文件&#xff08;面数据&#xff0c;也就是行…

去中心化的信任,Web3如何塑造更加牢固的客户忠诚度

在当今数字化的时代&#xff0c;客户忠诚度对于企业的成功至关重要。而随着Web3技术的崛起&#xff0c;我们正面临着一场信任的革命。本文将探讨Web3如何塑造更加牢固的客户忠诚度&#xff0c;并为企业带来长期的商业价值。 1.去中心化的信任机制 在传统的Web2模式下&#xff…