Hibernate關聯對映(一對多/多對多)
3. Hibernate關聯對映
上接Hibernate持久化類:https://blog.csdn.net/biggerchong/article/details/84260707
目錄
3.2.2 建立Java專案Hibernate5Study3
3.2.3 建立持久化類(Customer、LinkMan)
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
-----謝謝閱讀! ------知飛翀