Hibernate关联映射(一对多/多对多)

版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/84340105
3.  Hibernate关联映射
上接Hibernate持久化类:https://blog.csdn.net/biggerchong/article/details/84260707

目录
3.  Hibernate关联映射

3.1 数据库表之间的关系

3.1.1 一对多关系

3.1.2 多对多关系

3.1.3 一对一关系(实际开发中使用较少)

3.2 实战Hibernate一对多关联映射

3.2.1 创建数据表(客户----联系人)

3.2.2 创建Java项目Hibernate5Study3

3.2.3 创建持久化类(Customer、LinkMan)

3.2.4 创建文件映射关系

3.2.5 Hibernate核心映射

3.2.6 测试一对多关联映射

3.2.7 一对多级联操作

3.2.8 双向级联产生多余SQL

3.3 实战多对多关联映射

3.3.1 创建表

3.3.2 创建实体

3.3.3 创建映射

3.3.4 编写测试类

 

3.1 数据库表之间的关系
3.1.1 一对多关系
一张表中的一条记录对应另一张表中的多条记录;反之不成立。

一对多关系建表原则:

 

3.1.2 多对多关系
一张表中的一条记录对应另一张表中的多条记录;反之也成立。

多对多关系建表原则:

 

 

3.1.3 一对一关系(实际开发中使用较少)
一张表中的一条记录对应另一张表中的唯一一条记录;反之也成立。(可以用一张表替代)

一对一关系建表原则:

 

3.2 实战Hibernate一对多关联映射
3.2.1 创建数据表(客户----联系人)
客户表:

CREATE TABLE `cst_customer` (

  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',

  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',

  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',

  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',

  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',

  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',

  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',

  PRIMARY KEY (`cust_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

联系人表:

CREATE TABLE `cst_linkman` (

  `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '联系人编号(主键)',

  `lkm_name` varchar(16) DEFAULT NULL COMMENT '联系人姓名',

  `lkm_cust_id` bigint(32) DEFAULT NULL COMMENT '客户id',

  `lkm_gender` char(1) DEFAULT NULL COMMENT '联系人性别',

  `lkm_phone` varchar(16) DEFAULT NULL COMMENT '联系人办公电话',

  `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '联系人手机',

  `lkm_email` varchar(64) DEFAULT NULL COMMENT '联系人邮箱',

  `lkm_qq` varchar(16) DEFAULT NULL COMMENT '联系人qq',

  `lkm_position` varchar(16) DEFAULT NULL COMMENT '联系人职位',

  `lkm_memo` varchar(512) DEFAULT NULL COMMENT '联系人备注',

  PRIMARY KEY (`lkm_id`),

  KEY `FK_cst_linkman_lkm_cust_id` (`lkm_cust_id`),

  CONSTRAINT `FK_cst_linkman_lkm_cust_id` FOREIGN KEY (`lkm_cust_id`) REFERENCES `cst_customer` (`cust_id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

客户-----联系人关系图(一对多关系):

 

3.2.2 创建Java项目Hibernate5Study3
引入相应Jar包 并build path

 

 

3.2.3 创建持久化类(Customer、LinkMan)
Customer:

 

 

LinkMan:

 

 

并加上相应得到getter/setter方法,构造函数

 

3.2.4 创建文件映射关系
LinkMan.hbm.xml文件:

 

 

Customer.hbm.xml文件:

 

 

3.2.5 Hibernate核心映射
红框内注意,其他与之间介绍的一样。

 

 

3.2.6 测试一对多关联映射


 

3.2.7 一对多级联操作
级联:操作一个对象的时候,会同时操作与其相关联的对象。

级联方向性:

从one到many的方向:操作one对象能同时操作many对象
从many到one的方向:操作many对象能同时操作one对象
级联保存或更新

从one到many的方向:改变one(Customer.hbm.xml)的映射文件

 

 

从many到one的方向:改变many(LinkMan.hbm.xml)的映射文件

 

 

注:注意级联方向,session.save(…);会产生级联关系的保存(隐式保存)

 

级联删除:关联起来同时删除

         在没有配置的情况下,Hibernate默认先将关联外键取消置为null,然后再删除指定记录,不会进行级联删除

 

下面在对应的映射文件中进行配置实现级联删除(仍然具有方向性):

         LinkMan.hbm.xml文件(基本不用)

 

 

         Customer.hbm.xml文件

 

3.2.8 双向级联产生多余SQL


解决多余的SQL语句:

 

单向维护
使一方放弃外键维护权:one的一方放弃。在set上配置inverse=”true”
 

说明:cascade控制级联关系,inverse控制外键关联关系(inverse=”true”取消外键关联关系)

3.3 实战多对多关联映射
3.3.1 创建表
 用户表

CREATE TABLE `sys_user` (

  `user_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '用户id',

  `user_code` varchar(32) NOT NULL COMMENT '用户账号',

  `user_name` varchar(64) NOT NULL COMMENT '用户名称',

  `user_password` varchar(32) NOT NULL COMMENT '用户密码',

  `user_state` char(1) NOT NULL COMMENT '1:正常,0:暂停',

  PRIMARY KEY (`user_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

角色表

CREATE TABLE `sys_role` (

  `role_id` bigint(32) NOT NULL AUTO_INCREMENT,

  `role_name` varchar(32) NOT NULL COMMENT '角色名称',

  `role_memo` varchar(128) DEFAULT NULL COMMENT '备注',

  PRIMARY KEY (`role_id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

中间表

CREATE TABLE `sys_user_role` (

  `role_id` bigint(32) NOT NULL COMMENT '角色id',

  `user_id` bigint(32) NOT NULL COMMENT '用户id',

  PRIMARY KEY (`role_id`,`user_id`),

  KEY `FK_user_role_user_id` (`user_id`),

  CONSTRAINT `FK_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `sys_role` (`role_id`) ON DELETE NO ACTION ON UPDATE NO ACTION,

  CONSTRAINT `FK_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `sys_user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 
3.3.2 创建实体
用户的实体

 

角色的实体

 

 
3.3.3 创建映射
用户的映射

 

 

角色的映射

 

3.3.4 编写测试类


说明:多对多关联映射中也存在级联更新保存与删除,与前面介绍的一对多级联更新保存与删除是一样的配置映射文件,如下图:

 

User.hbm.xml文件

 

 

Role.hbm.xml文件

 

         注:一般将被动关联方(Role被User来选)的inverse设为“ture”

 

多对多关系中级联删除是不合理的,常规情况下不会使用;最常使用的是改选关联关系、删除关联关系、添加关联关系,这三种在实际应用中最为常见,都是遵循先get/load查询在操作关联关系(remove/add),然后session.save()、session.delete()、session.update()即可。

下接Hibernate查询与抓取策略(优化):https://blog.csdn.net/biggerchong/article/details/84402907        

                                                                                                                   -----谢谢阅读!                  ------知飞翀
---------------------
作者:知飞翀
来源:CSDN
原文:https://blog.csdn.net/biggerchong/article/details/84340105
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/Jeely/p/11226263.html

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

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

相关文章

微信小程序适配iphonex

// 在app.js中判断是否是哪种设备 globalData: { isIphoneX: false, userInfo: null }, onShow:function(){ let that this; wx.getSystemInfo({ success: res>{ // console.log(手机信息res res.model) let modelmes res.model; if (modelmes.search(iPho…

Java Minor发布计划再次进行了调整

2013年,Oracle宣布了Java SE –版本编号方案更改 。 该公告指出,将使用特定的版本号方案来发行受限更新版本(那些“包括新功能和非安全修复程序”)和关键补丁更新(CPU)“那些仅包含安全漏洞修复程序”。 特…

asp.net服务器端跳转页面的三种方法

asp.net服务器端跳转页面的三种方法1、Response.Redirect这个跳转页面的方法跳转速度不快,因为它要走2次回发(postback)。 它可以跳转到任何页面,没有站点页面限制(可以由baidu跳转到google),但不能跳过登录保护。 速度慢是其最大缺陷&#x…

动态规划--图像压缩

<算法设计与分析> --王晓东 题目描述和解析参照&#xff1a;http://blog.csdn.net/liufeng_king/article/details/8648195 他在那里分析得非常的详细。我也是按照这种思路来解的&#xff0c;而且算法设计与实现的课件上也是这么个解法。 主要是理解这个公式&#xff0c;…

如何安全使用SWT的显示器asyncExec

大多数用户界面&#xff08;UI&#xff09;工具包都是单线程的&#xff0c; SWT也不例外。 这意味着必须仅从单个线程&#xff08;即所谓的UI线程&#xff09;访问UI对象。 另一方面&#xff0c;应在后台线程中执行长时间运行的任务&#xff0c;以使UI保持响应。 这使得后台线程…

解决添加Com引用 生成的Interop.*.dll 版本号永远是1.0的问题

在项目里面&#xff0c;添加对COM的引用时&#xff0c;自动生成了Interop.*.dll&#xff0c;但是这个dll的版本号永远是1.0. 如果使用InstallShield 制作安装包&#xff0c;进行修改安装时&#xff0c;这个dll不会被更新&#xff0c;就因为版本号永远是1.0 想修改这个版本号&am…

web页面全角半角

根据Unicode编码&#xff0c;全角空格为12288&#xff0c;半角空格为32 &#xff1b; 其他字符半角(33-126)与全角(65281-65374)的对应关系是&#xff1a;均相差65248 全角-->半角函数 //半角转换为全角函数 function ToBCD(str) { var tmp ""; for(var i0;…

Cannot find module '@babel/plugin-proposal-class-properties'

cnpm install --save-dev babel/plugin-proposal-class-properties转载于:https://www.cnblogs.com/qq917937712/p/11226922.html

可选和对象:空指针救星!

没有人喜欢空指针异常 &#xff01; 我们有办法摆脱它们吗&#xff1f; 也许 。 。 。 这篇文章中讨论了几种技术&#xff1a; 可选类型&#xff08;Java 8中的新增功能&#xff09; 对象类&#xff08;旧的Java 7东西&#xff01;&#xff09; Java 8中的可选类型 它是什…

oracle 存储过程的基本语法 及注意事项

oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字( 参数1 IN NUMBER, 参数2 IN NUMBER) IS变量1 INTEGER :0;变量2 DATE;BEGIN END 存储过程名字2.SELECT INTO STATEMENT 将select查询的结果存入到变量中&#xff0c;可以同时将多个列存…

function——函数声明头的提升和预解析

函数&#xff1a; 即function语句的集合&#xff0c;就是将多个语句封装到一起&#xff1b; 函数的执行要会自己遍历&#xff0c;遇见函数 a&#xff08;&#xff09;&#xff1b;执行语句&#xff0c;就要移交控制权&#xff0c;函数执行完毕之后&#xff0c;控制权又移交回…

在JDeveloper 12.1.3中将Java API用于WebSockets

介绍 最新版本的JDeveloper 12c&#xff08;12.1.3.0&#xff09;和WebLogic Server 12.1.3一起提供了一些新的Java EE 7功能。 其中之一是对用于WebSocket的JSR 356 Java API的支持。 实际上&#xff0c;从12.1.2.0版本开始就支持WebSocket协议&#xff08;RFC 6455&#xff0…

基于Verilog语言的伪随机码的编写

写之初&#xff0c;笔者并没有太大的自信&#xff0c;因为笔者对伪随机码并没有太多的认识。但老师有命&#xff0c;笔者不得不进行编写&#xff0c;同时笔者也特别希望能有个项目来锻炼自己。 笔者在开始编写的时候&#xff0c;首先上网查了很多的资料&#xff0c;对伪随机码算…

【HBuilder】手机App推送至Apple App Store过程

一、前言 最近由于公司同事离职&#xff0c;顶替这位同事从事手机App的研发工作&#xff0c;BIM数据平台部门采用的是HBuilder作为手机App的制作环境。本篇介绍我是如何将HBuilder的Release包发布至App Store的。 二、内容 1. 首先登录Apple Developer网站 2. 点击iTunes Conn…

Java性能调优调查结果(第四部分)

这是系列文章中的最后一篇&#xff0c;我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果。如果您还没有阅读第一篇文章&#xff0c;我建议您首先阅读以下内容&#xff1a; 性能问题的频率和严重性 最受欢迎的监控解决方案 查找根本原因的工具和技术 …

2012年第一个工作日

换代理尝试&#xff0c;竟然可以发博客了。以前的博客太散乱&#xff0c;打算在这里安家。 今天花了一上午时间&#xff0c;在各大网站不停地晃。希望自己能够弄清楚这个快速变化的世界。 2012确切的目标&#xff1a; 1. 工作仍然是首要的&#xff0c;锻炼的能力不同而已&#…

基于ArcEngine的插件式框架

先整理下&#xff0c;过几天把我以前用过的一个插件式GIS框架共享出来。转载于:https://www.cnblogs.com/songhuaiyu/archive/2010/08/16/1800854.html

【JQuery】选择器

一、前言 上一章学习完了Js的一些基本内容&#xff0c;本章开始学习JQuery语法。JQuery的基础语法是&#xff1a; $(selector).action() 那么重要的两个元素&#xff0c;一个是选择器&#xff0c;另一个是行为&#xff01;本章开始学习JQuery的选择器。 二、内容 $("*&quo…

android eclipse 配置 在项目右击选择properties

转载于:https://www.cnblogs.com/guoxiaoyue/p/3485243.html

减少主要GC暂停的频率

这篇文章将讨论一种技术&#xff0c;以减少应用程序等待时间造成的垃圾收集暂停的负担。 正如我几年前所写&#xff0c; 在JVM中无法禁用垃圾收集 。 但是&#xff0c;有一个巧妙的技巧可以用来大大减少长时间停顿的时间和频率。 如您所知&#xff0c;JVM中发生了两个不同的GC…