1. 程式人生 > >Hibernate關聯對映(一對多/多對多)

Hibernate關聯對映(一對多/多對多)

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 一對多級聯操作

級聯:操作一個物件的時候,會同時操作與其相關聯的物件。

級聯方向性:

  1. 從one到many的方向:操作one物件能同時操作many物件
  2. 從many到one的方向:操作many物件能同時操作one物件

級聯儲存或更新

onemany的方向:改變oneCustomer.hbm.xml)的對映檔案

 

manyone的方向:改變many(LinkMan.hbm.xml)的對映檔案

 

注:注意級聯方向,session.save(…);會產生級聯關係的儲存(隱式儲存)

 

級聯刪除:關聯起來同時刪除

         在沒有配置的情況下,Hibernate預設先將關聯外來鍵取消置為null,然後再刪除指定記錄,不會進行級聯刪除

 

下面在對應的對映檔案中進行配置實現級聯刪除(仍然具有方向性)

         LinkMan.hbm.xml檔案(基本不用)

 

         Customer.hbm.xml檔案

3.2.8 雙向級聯產生多餘SQL

解決多餘的SQL語句:

 

  1. 單向維護
  2. 使一方放棄外來鍵維護權: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檔案

         注:一般將被動關聯方(RoleUser來選)的inverse設為“ture

 

多對多關係中級聯刪除是不合理的,常規情況下不會使用;最常使用的是改選關聯關係、刪除關聯關係、新增關聯關係,這三種在實際應用中最為常見,都是遵循先get/load查詢在操作關聯關係(remove/add),然後session.save()session.delete()session.update()即可。


下接Hibernate查詢與抓取策略(優化):https://blog.csdn.net/biggerchong/article/details/84402907        

                                                                                                                   -----謝謝閱讀!                  ------知飛翀