第1章 Hibernate_day03筆記
1.1 上次課內容回顧
-
Hibernate的持久化類的編寫規則
- 無參數構造
- 屬性私有
- 屬性儘量使用包裝類
- 提供一個唯一OID與主鍵對應
- 不要使用final修飾
-
Hibernate的主鍵生成策略
- 主鍵分類
- 自然主鍵
- 代理主鍵
- 主鍵生成策略
- increment
- identity
- sequence
- uuid
- native
- assigned
- foreign
- 主鍵分類
-
Hibernate的持久化類的三種狀態
- 瞬時態:沒有唯一標識OID,沒有被session管理
- 持久態:有唯一標識OID,已經被session管理
- 脫管態:有唯一標識OID,沒有被session管理
- 狀態轉換:(瞭解)
-
Hibernate的一級緩存
-
一級緩存:Hibernate優化手段,稱爲是session級別緩存。
-
一級緩存:快照區
-
Hibernate的事務管理
- 事務的回顧
- 事務的概念
- 事務的特性
- 引發安全性問題
- 安全性問題解決
- Hibernate解決讀問題
- 配置設置隔離級別
- Hibernate解決Service事務
- 採用的是線程綁定的方式
- 事務的回顧
-
Hibernate的其他的API
- Query :HQL 面向對象方式的查詢。
- Criteria :QBC 完成面向對象化。
- SQLQuery :SQL查詢
1.2 Hibernate的一對多關聯映射
1.2.1 數據庫表與表之間的關係
1.2.1.1 一對多關係
- 什麼樣關係屬於一對多?
- 一個部門對應多個員工,一個員工只能屬於某一個部門。
- 一個客戶對應多個聯繫人,一個聯繫人只能屬於某一個客戶。
- 一對多的建表原則:
1.2.1.2 多對多關係
- 什麼樣關係屬於多對多?
- 一個學生可以選擇多門課程,一門課程也可以被多個學生選擇。
- 一個用戶可以選擇多個角色,一個角色也可以被多個用戶選擇。
- 多對多的建表原則:
1.2.1.3 一對一關係(瞭解)
- 什麼樣關係屬於一對一?
- 一個公司只能有一個註冊地址,一個註冊地址只能被一個公司註冊。
- 一對一的建表原則:
1.2.2 Hibernate一對多的關係配置
1.2.2.1 創建一個項目,引入相應jar包
1.2.2.2 創建數據庫和表
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;
1.2.2.3 創建實體
-
一的一方的實體
-
多的一方的實體
1.2.2.4 創建映射文件
-
多的一方的映射的創建
-
一的一方的映射的創建
1.2.2.5 創建核心配置文件
1.2.2.6 引入工具類
1.2.2.7 編寫測試類
1.2.3 Hibernate的一對多相關操作
1.2.3.1 一對多關係只保存一邊是否可以:
1.2.3.2 一對多的級聯操作
- 什麼叫做級聯
- 級聯指的是,操作一個對象的時候,是否會同時操作其關聯的對象。
- 級聯是有方向性
- 操作一的一方的時候,是否操作到多的一方
- 操作多的一方的時候,是否操作到一的一方
1.2.3.3 級聯保存或更新
- 保存客戶級聯聯繫人
- 保存聯繫人級聯客戶
1.2.3.4 測試對象的導航
1.2.3.5 級聯刪除
- 級聯刪除:
- 刪除一邊的時候,同時將另一方的數據也一併刪除。
- 刪除客戶級聯刪除聯繫人
- 刪除聯繫人級聯刪除客戶(基本不用)
1.2.3.6 一對多設置了雙向關聯產生多餘的SQL語句
- 解決多餘的SQL語句
- 單向維護:
- 使一方放棄外鍵維護權:
- 一的一方放棄。在set上配置inverse=”true”
- 一對多的關聯查詢的修改的時候。(CRM練習–)
1.2.3.7 區分cascade和inverse
1.3 Hibernate的多對多關聯映射
1.3.1 Hibernate多對多關係的配置
1.3.1.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;
1.3.1.2 創建實體
- 用戶的實體
- 角色的實體
1.3.1.3 創建映射
- 用戶的映射
- 角色的映射
1.3.1.4 編寫測試類
1.3.2 Hibernate的多對多的操作
1.3.2.1 只保存一邊是否可以
1.3.2.2 多對多的級聯保存或更新
- 保存用戶級聯保存角色
- 保存角色級聯保存用戶
1.3.2.3 多對多的級聯刪除(基本用不上)
- 刪除用戶級聯刪除角色
- 刪除角色級聯刪除用戶
1.3.2.4 多對多的其他的操作
- 給用戶選擇角色
- 給用戶改選角色
- 給用戶刪除角色