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
總結
以上是生活随笔為你收集整理的Hibernate关联映射(一对多/多对多)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机智云小程序启蒙:WebSocket网页
- 下一篇: 动态规划--图像压缩