Hibernate关联映射(一对多/多对多)
版權(quán)聲明:翀版 https://blog.csdn.net/biggerchong/article/details/84340105
3.? Hibernate關(guān)聯(lián)映射
上接Hibernate持久化類:https://blog.csdn.net/biggerchong/article/details/84260707
目錄
3.? Hibernate關(guān)聯(lián)映射
3.1 數(shù)據(jù)庫表之間的關(guān)系
3.1.1 一對多關(guān)系
3.1.2 多對多關(guān)系
3.1.3 一對一關(guān)系(實(shí)際開發(fā)中使用較少)
3.2 實(shí)戰(zhàn)Hibernate一對多關(guān)聯(lián)映射
3.2.1 創(chuàng)建數(shù)據(jù)表(客戶----聯(lián)系人)
3.2.2 創(chuàng)建Java項(xiàng)目Hibernate5Study3
3.2.3 創(chuàng)建持久化類(Customer、LinkMan)
3.2.4 創(chuàng)建文件映射關(guān)系
3.2.5 Hibernate核心映射
3.2.6 測試一對多關(guān)聯(lián)映射
3.2.7 一對多級聯(lián)操作
3.2.8 雙向級聯(lián)產(chǎn)生多余SQL
3.3 實(shí)戰(zhàn)多對多關(guān)聯(lián)映射
3.3.1 創(chuàng)建表
3.3.2 創(chuàng)建實(shí)體
3.3.3 創(chuàng)建映射
3.3.4 編寫測試類
?
3.1 數(shù)據(jù)庫表之間的關(guān)系
3.1.1 一對多關(guān)系
一張表中的一條記錄對應(yīng)另一張表中的多條記錄;反之不成立。
一對多關(guān)系建表原則:
?
3.1.2 多對多關(guān)系
一張表中的一條記錄對應(yīng)另一張表中的多條記錄;反之也成立。
多對多關(guān)系建表原則:
?
?
3.1.3 一對一關(guān)系(實(shí)際開發(fā)中使用較少)
一張表中的一條記錄對應(yīng)另一張表中的唯一一條記錄;反之也成立。(可以用一張表替代)
一對一關(guān)系建表原則:
?
3.2 實(shí)戰(zhàn)Hibernate一對多關(guān)聯(lián)映射
3.2.1 創(chuàng)建數(shù)據(jù)表(客戶----聯(lián)系人)
客戶表:
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 '客戶所屬行業(yè)',
? `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;
?
聯(lián)系人表:
CREATE TABLE `cst_linkman` (
? `lkm_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '聯(lián)系人編號(主鍵)',
? `lkm_name` varchar(16) DEFAULT NULL COMMENT '聯(lián)系人姓名',
? `lkm_cust_id` bigint(32) DEFAULT NULL COMMENT '客戶id',
? `lkm_gender` char(1) DEFAULT NULL COMMENT '聯(lián)系人性別',
? `lkm_phone` varchar(16) DEFAULT NULL COMMENT '聯(lián)系人辦公電話',
? `lkm_mobile` varchar(16) DEFAULT NULL COMMENT '聯(lián)系人手機(jī)',
? `lkm_email` varchar(64) DEFAULT NULL COMMENT '聯(lián)系人郵箱',
? `lkm_qq` varchar(16) DEFAULT NULL COMMENT '聯(lián)系人qq',
? `lkm_position` varchar(16) DEFAULT NULL COMMENT '聯(lián)系人職位',
? `lkm_memo` varchar(512) DEFAULT NULL COMMENT '聯(lián)系人備注',
? 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;
?
客戶-----聯(lián)系人關(guān)系圖(一對多關(guān)系):
?
3.2.2 創(chuàng)建Java項(xiàng)目Hibernate5Study3
引入相應(yīng)Jar包 并build path
?
?
3.2.3 創(chuàng)建持久化類(Customer、LinkMan)
Customer:
?
?
LinkMan:
?
?
并加上相應(yīng)得到getter/setter方法,構(gòu)造函數(shù)
?
3.2.4 創(chuàng)建文件映射關(guān)系
LinkMan.hbm.xml文件:
?
?
Customer.hbm.xml文件:
?
?
3.2.5 Hibernate核心映射
紅框內(nèi)注意,其他與之間介紹的一樣。
?
?
3.2.6 測試一對多關(guān)聯(lián)映射
?
3.2.7 一對多級聯(lián)操作
級聯(lián):操作一個(gè)對象的時(shí)候,會同時(shí)操作與其相關(guān)聯(lián)的對象。
級聯(lián)方向性:
從one到many的方向:操作one對象能同時(shí)操作many對象
從many到one的方向:操作many對象能同時(shí)操作one對象
級聯(lián)保存或更新
從one到many的方向:改變one(Customer.hbm.xml)的映射文件
?
?
從many到one的方向:改變many(LinkMan.hbm.xml)的映射文件
?
?
注:注意級聯(lián)方向,session.save(…);會產(chǎn)生級聯(lián)關(guān)系的保存(隱式保存)
?
級聯(lián)刪除:關(guān)聯(lián)起來同時(shí)刪除
???????? 在沒有配置的情況下,Hibernate默認(rèn)先將關(guān)聯(lián)外鍵取消置為null,然后再刪除指定記錄,不會進(jìn)行級聯(lián)刪除
?
下面在對應(yīng)的映射文件中進(jìn)行配置實(shí)現(xiàn)級聯(lián)刪除(仍然具有方向性):
???????? LinkMan.hbm.xml文件(基本不用)
?
?
???????? Customer.hbm.xml文件
?
3.2.8 雙向級聯(lián)產(chǎn)生多余SQL
解決多余的SQL語句:
?
單向維護(hù)
使一方放棄外鍵維護(hù)權(quán):one的一方放棄。在set上配置inverse=”true”
?
說明:cascade控制級聯(lián)關(guān)系,inverse控制外鍵關(guān)聯(lián)關(guān)系(inverse=”true”取消外鍵關(guān)聯(lián)關(guān)系)
3.3 實(shí)戰(zhàn)多對多關(guān)聯(lián)映射
3.3.1 創(chuàng)建表
?用戶表
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 創(chuàng)建實(shí)體
用戶的實(shí)體
?
角色的實(shí)體
?
?
3.3.3 創(chuàng)建映射
用戶的映射
?
?
角色的映射
?
3.3.4 編寫測試類
說明:多對多關(guān)聯(lián)映射中也存在級聯(lián)更新保存與刪除,與前面介紹的一對多級聯(lián)更新保存與刪除是一樣的配置映射文件,如下圖:
?
User.hbm.xml文件
?
?
Role.hbm.xml文件
?
???????? 注:一般將被動關(guān)聯(lián)方(Role被User來選)的inverse設(shè)為“ture”
?
多對多關(guān)系中級聯(lián)刪除是不合理的,常規(guī)情況下不會使用;最常使用的是改選關(guān)聯(lián)關(guān)系、刪除關(guān)聯(lián)關(guān)系、添加關(guān)聯(lián)關(guān)系,這三種在實(shí)際應(yīng)用中最為常見,都是遵循先get/load查詢在操作關(guān)聯(lián)關(guān)系(remove/add),然后session.save()、session.delete()、session.update()即可。
下接Hibernate查詢與抓取策略(優(yōu)化):https://blog.csdn.net/biggerchong/article/details/84402907? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-----謝謝閱讀!? ? ? ? ? ? ? ? ? ------知飛翀
---------------------
作者:知飛翀
來源:CSDN
原文:https://blog.csdn.net/biggerchong/article/details/84340105
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
轉(zhuǎn)載于:https://www.cnblogs.com/Jeely/p/11226263.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate关联映射(一对多/多对多)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机智云小程序启蒙:WebSocket网页
- 下一篇: 动态规划--图像压缩