數(shù)據(jù)層框架技術(shù)_第1頁(yè)
數(shù)據(jù)層框架技術(shù)_第2頁(yè)
數(shù)據(jù)層框架技術(shù)_第3頁(yè)
數(shù)據(jù)層框架技術(shù)_第4頁(yè)
數(shù)據(jù)層框架技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、www.si-數(shù)據(jù)訪問(wèn)層數(shù)據(jù)訪問(wèn)層框架技術(shù)框架技術(shù)VASD 部門培訓(xùn)部門培訓(xùn)北京神州數(shù)碼思特奇信息技術(shù)股份有限公司北京神州數(shù)碼思特奇信息技術(shù)股份有限公司研究院研究院 數(shù)據(jù)訪問(wèn)層組件數(shù)據(jù)訪問(wèn)層組件 Hibernate (專題培訓(xùn))(專題培訓(xùn)) wwwframe(專題培訓(xùn))(專題培訓(xùn)) IBatis (專題培訓(xùn))(專題培訓(xùn))內(nèi)內(nèi) 容容第一部分HIBERNATE目 錄q 課程目標(biāo):課程目標(biāo):q理解理解O/R MappingO/R Mapping原理原理q快速體驗(yàn)快速體驗(yàn)HibernateHibernate開發(fā)步驟開發(fā)步驟q認(rèn)識(shí)認(rèn)識(shí)HibernateHibernate核心接口核心接口qHibernat

2、eHibernate對(duì)象關(guān)系映射對(duì)象關(guān)系映射qHibernateHibernate查詢語(yǔ)言(查詢語(yǔ)言(HQLHQL)qHibernateHibernate進(jìn)階:性能優(yōu)化策略進(jìn)階:性能優(yōu)化策略Hibernate? 直接使用直接使用JDBCJDBC操作數(shù)據(jù)庫(kù)的步驟很繁瑣操作數(shù)據(jù)庫(kù)的步驟很繁瑣 JDBCJDBC操作的是關(guān)系型數(shù)據(jù)庫(kù)操作的是關(guān)系型數(shù)據(jù)庫(kù) 我們用我們用JAVAJAVA開發(fā)程序,則使用面向?qū)ο蟮乃枷腴_發(fā)程序,則使用面向?qū)ο蟮乃枷?HibernateHibernate正是在這兩種不同的模型之間建立關(guān)聯(lián),正是在這兩種不同的模型之間建立關(guān)聯(lián),HibernateHibernate給我們提供了利用面

3、向?qū)ο蟮乃枷雭?lái)操作關(guān)系型給我們提供了利用面向?qū)ο蟮乃枷雭?lái)操作關(guān)系型數(shù)據(jù)的接口數(shù)據(jù)的接口什么是關(guān)系模型(什么是關(guān)系模型(Relational Model)?)?關(guān)系模型把世界看作由實(shí)體關(guān)系模型把世界看作由實(shí)體(Entity)和聯(lián)系和聯(lián)系(Relationship)構(gòu)成的。構(gòu)成的。 所謂實(shí)體就是指現(xiàn)實(shí)世界中具有區(qū)分與其它事物的特征或?qū)傩圆⑴c其所謂實(shí)體就是指現(xiàn)實(shí)世界中具有區(qū)分與其它事物的特征或?qū)傩圆⑴c其它實(shí)體有聯(lián)系的對(duì)象。在關(guān)系模型中實(shí)體通常是以表的形式來(lái)表現(xiàn)的它實(shí)體有聯(lián)系的對(duì)象。在關(guān)系模型中實(shí)體通常是以表的形式來(lái)表現(xiàn)的。表的每一行描述實(shí)體的一個(gè)實(shí)例,表的每一列描述實(shí)體的一個(gè)特征。表的每一行描述實(shí)體

4、的一個(gè)實(shí)例,表的每一列描述實(shí)體的一個(gè)特征或?qū)傩??;驅(qū)傩浴?所謂聯(lián)系就是指實(shí)體之間的關(guān)系,即實(shí)體之間的對(duì)應(yīng)關(guān)系。所謂聯(lián)系就是指實(shí)體之間的關(guān)系,即實(shí)體之間的對(duì)應(yīng)關(guān)系。 1:1 1:n m:n 關(guān)系數(shù)據(jù)庫(kù)關(guān)系數(shù)據(jù)庫(kù) 表表 字段字段 主鍵主鍵 外鍵外鍵什么是面向?qū)ο??什么是面向?qū)ο??面向?qū)ο笕筇卣鳎好嫦驅(qū)ο笕筇卣鳎?封裝、繼承(一般與特殊)、多態(tài)(覆蓋與重載)封裝、繼承(一般與特殊)、多態(tài)(覆蓋與重載)類類對(duì)象對(duì)象屬性屬性關(guān)系關(guān)系 一般與特殊關(guān)系(一般與特殊關(guān)系(is a) 組成(組成(has a) 關(guān)聯(lián)及其多重性關(guān)聯(lián)及其多重性 1:1 1:n m:n 雙向關(guān)聯(lián)與單向關(guān)聯(lián)雙向關(guān)聯(lián)與單向關(guān)聯(lián)對(duì)象關(guān)系

5、映射(對(duì)象關(guān)系映射(Object Relational Mapping,簡(jiǎn)稱,簡(jiǎn)稱ORM) ORM是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫(kù)存在的互不匹配的現(xiàn)象的技術(shù)。簡(jiǎn)單的說(shuō),的技術(shù)。簡(jiǎn)單的說(shuō),ORM是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的是通過(guò)使用描述對(duì)象和數(shù)據(jù)庫(kù)之間映射的元數(shù)據(jù),將元數(shù)據(jù),將java程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。本質(zhì)上就程序中的對(duì)象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫(kù)中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。 Why ORM? 面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方面向?qū)ο?/p>

6、的開發(fā)方法是當(dāng)今企業(yè)級(jí)應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法法 關(guān)系數(shù)據(jù)庫(kù)是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系關(guān)系數(shù)據(jù)庫(kù)是企業(yè)級(jí)應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲(chǔ)系統(tǒng)統(tǒng) 字母字母O起源于起源于“對(duì)象對(duì)象”(Object),而而R則來(lái)自于則來(lái)自于“關(guān)系關(guān)系”(Relational)。幾乎。幾乎所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在業(yè)務(wù)邏輯層和呈現(xiàn)層所有的程序里面,都存在對(duì)象和關(guān)系數(shù)據(jù)庫(kù)。在業(yè)務(wù)邏輯層和呈現(xiàn)層中,我們是面向?qū)ο蟮?。?dāng)對(duì)象信息發(fā)生變化的時(shí)候,我們需要把對(duì)中,我們是面向?qū)ο蟮?。?dāng)對(duì)象信息發(fā)生變化的時(shí)候,我們需要把對(duì)象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。象的信息保存在關(guān)系數(shù)據(jù)庫(kù)中。 當(dāng)你開發(fā)

7、一個(gè)應(yīng)用程序的時(shí)候當(dāng)你開發(fā)一個(gè)應(yīng)用程序的時(shí)候(不使用不使用O/R Mapping),你可能會(huì)寫不少你可能會(huì)寫不少數(shù)據(jù)訪問(wèn)層的代碼,用來(lái)從數(shù)據(jù)庫(kù)保存,刪除,讀取對(duì)象信息,等等數(shù)據(jù)訪問(wèn)層的代碼,用來(lái)從數(shù)據(jù)庫(kù)保存,刪除,讀取對(duì)象信息,等等。而這些代碼寫起來(lái)總是重復(fù)的。而這些代碼寫起來(lái)總是重復(fù)的。 對(duì)象關(guān)系映射模式對(duì)象關(guān)系映射模式 屬性映射屬性映射 類映射類映射 關(guān)聯(lián)映射關(guān)聯(lián)映射 一對(duì)一一對(duì)一 一對(duì)多一對(duì)多 多對(duì)多多對(duì)多什么是什么是Hibernate?對(duì)象對(duì)象/ /關(guān)系映射一直都是數(shù)據(jù)庫(kù)技術(shù)中的難點(diǎn),盡管人們提出了許多關(guān)系映射一直都是數(shù)據(jù)庫(kù)技術(shù)中的難點(diǎn),盡管人們提出了許多方案解決這個(gè)問(wèn)題,但都不能完全

8、做到即便利又高效。方案解決這個(gè)問(wèn)題,但都不能完全做到即便利又高效。EJBEJB的推出讓的推出讓人們看到了希望,但實(shí)踐證明實(shí)體人們看到了希望,但實(shí)踐證明實(shí)體BeanBean的效率并不高,并且還十分難的效率并不高,并且還十分難于為初學(xué)者理解。由于為初學(xué)者理解。由Gavin KingGavin King創(chuàng)建的創(chuàng)建的HibernateHibernate框架,從某種程序框架,從某種程序上正在朝著正確的方向邁走,并且得到越來(lái)越多上正在朝著正確的方向邁走,并且得到越來(lái)越多ITIT從業(yè)人員的認(rèn)可。從業(yè)人員的認(rèn)可。就像當(dāng)年的就像當(dāng)年的StrutsStruts框架一樣,框架一樣,HibernateHibernat

9、e也已經(jīng)在許多項(xiàng)目中得到廣也已經(jīng)在許多項(xiàng)目中得到廣泛應(yīng)用。泛應(yīng)用。HibernateHibernate由于投注了更多的精力在提升效率上,使用起來(lái)由于投注了更多的精力在提升效率上,使用起來(lái)又十分方便,新版的又十分方便,新版的EJBEJB規(guī)范正在向規(guī)范正在向HibernateHibernate方向靠攏。正是由于得方向靠攏。正是由于得到廣泛的認(rèn)可,到廣泛的認(rèn)可,HibernateHibernate已經(jīng)成為程序員必須掌握的技術(shù)之一。已經(jīng)成為程序員必須掌握的技術(shù)之一。Hibernate能做什么?能做什么? - 理解理解O/R映射映射 HibernateHibernate能幫助我們利用能幫助我們利用面向?qū)?/p>

10、象面向?qū)ο蟮乃枷?,開發(fā)的思想,開發(fā)基于關(guān)系型基于關(guān)系型數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)的應(yīng)用程序的應(yīng)用程序 第一:將對(duì)象數(shù)據(jù)保存到數(shù)據(jù)庫(kù)第一:將對(duì)象數(shù)據(jù)保存到數(shù)據(jù)庫(kù) 第二:將數(shù)據(jù)庫(kù)數(shù)據(jù)讀入對(duì)象中第二:將數(shù)據(jù)庫(kù)數(shù)據(jù)讀入對(duì)象中 基于基于B/SB/S的典型三層架構(gòu)的典型三層架構(gòu)關(guān)于分層關(guān)于分層* * 業(yè)務(wù)邏輯層和持久業(yè)務(wù)邏輯層和持久化層絕對(duì)不能依賴化層絕對(duì)不能依賴于展現(xiàn)層于展現(xiàn)層Hibernate與與O、R之間的關(guān)系之間的關(guān)系快速體驗(yàn)快速體驗(yàn)Hibernate 安裝以及創(chuàng)建新的項(xiàng)目安裝以及創(chuàng)建新的項(xiàng)目 下載下載Hibernate,并解壓縮,并解壓縮 使用使用Eclipse創(chuàng)建新的項(xiàng)目創(chuàng)建新的項(xiàng)目 引入引入Hiberna

11、te及其依賴庫(kù)(及其依賴庫(kù)(jar包)包) 引入數(shù)據(jù)庫(kù)驅(qū)動(dòng)包引入數(shù)據(jù)庫(kù)驅(qū)動(dòng)包 打開打開mysql控制臺(tái),創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)控制臺(tái),創(chuàng)建測(cè)試數(shù)據(jù)庫(kù)”hibernate” Create database hibernate; Use hibernate創(chuàng)建創(chuàng)建Hibernate配置文件配置文件 hibernate.cfg.xml jdbc:mysql://hibernatecom.mysql.jdbc.Driverrootmysql org.hibernate.dialect.MySQLDialect 創(chuàng)建持久化類創(chuàng)建持久化類 UserUserpublic class User pr

12、ivate String id;private String name;private String password;private Date createTime;private Date expireTime;.getters/setters創(chuàng)建類的映射文件創(chuàng)建類的映射文件 User.hbm.xml 將類的映射文件加入將類的映射文件加入Hibernate為了讓為了讓Hibernate能夠處理能夠處理User對(duì)象的持久化,需要將它的映射信息對(duì)象的持久化,需要將它的映射信息加入到加入到Hibernate中中加入的方法很簡(jiǎn)單,在加入的方法很簡(jiǎn)單,在Hibernate配置文件中加入:配置文件中加

13、入:即可即可resource屬性指定了映射文件的位置和名稱屬性指定了映射文件的位置和名稱創(chuàng)建數(shù)據(jù)庫(kù)表創(chuàng)建數(shù)據(jù)庫(kù)表 利用利用SchemaExport工具類工具類利用利用Hibernate提供的工具類來(lái)創(chuàng)建數(shù)據(jù)庫(kù)表提供的工具類來(lái)創(chuàng)建數(shù)據(jù)庫(kù)表創(chuàng)建創(chuàng)建ExportToDB類類public class ExportToDB public static void main(String args) throws Exception/讀取配置文件讀取配置文件Configuration cfg = new Configuration().configure();/創(chuàng)建創(chuàng)建SchemaExport對(duì)象對(duì)象Sch

14、emaExport export = new SchemaExport(cfg);/創(chuàng)建數(shù)據(jù)庫(kù)表創(chuàng)建數(shù)據(jù)庫(kù)表export.create(true,true);將對(duì)象保存到數(shù)據(jù)庫(kù)將對(duì)象保存到數(shù)據(jù)庫(kù) UserTest.javapublic static void main(String args) throws ExceptionConfiguration cfg = new Configuration().configure();SessionFactory factory = cfg.buildSessionFactory();Session session = factory.openSes

15、sion();session.beginTransaction();User user = new User();user.setName(“張三張三);user.setPassword(“zhangsan);user.setCreateTime(new Date();user.setExpireTime(new Date();session.save(user);session.getTransaction().commit();if(session.isOpen()session.close();實(shí)際操作體驗(yàn)實(shí)際操作體驗(yàn)Hibernate開發(fā)步驟開發(fā)步驟 按照上面的步驟,先快速體驗(yàn)一下按照

16、上面的步驟,先快速體驗(yàn)一下HibernateHibernate實(shí)際所做的實(shí)際所做的事情事情 HibernateHibernate開發(fā)步驟開發(fā)步驟 實(shí)體類(持久化類)的設(shè)計(jì)實(shí)體類(持久化類)的設(shè)計(jì) 實(shí)體類與關(guān)系數(shù)據(jù)庫(kù)的映射實(shí)體類與關(guān)系數(shù)據(jù)庫(kù)的映射 應(yīng)用的開發(fā)應(yīng)用的開發(fā)認(rèn)識(shí)認(rèn)識(shí) Hibernate 的基本組件的基本組件 實(shí)體類實(shí)體類 實(shí)體類映射文件實(shí)體類映射文件 重點(diǎn)重點(diǎn) HibernateHibernate配置文件配置文件 輔助工具輔助工具Hibernate核心接口核心接口Configuration 概述:概述:Configuration 類負(fù)責(zé)管理類負(fù)責(zé)管理Hibernate 的配置信息。它包

17、括如下的配置信息。它包括如下內(nèi)容:內(nèi)容:q Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的URL、用戶名、密碼、用戶名、密碼、JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫(kù)驅(qū)動(dòng)類,數(shù)據(jù)庫(kù)Dialect,數(shù)據(jù)庫(kù)連接池等。數(shù)據(jù)庫(kù)連接池等。q Hibernate映射文件(映射文件(*.hbm.xml)。)。 Hibernate配置的兩種方法:配置的兩種方法:q 屬性文件(屬性文件(perties)。)。調(diào)用代碼:調(diào)用代碼:Configuration cfg = new Configuration(); q Xml文件(文件(hibernate.cfg.xml)。)。調(diào)用代碼:調(diào)

18、用代碼:Configuration cfg = new Configuration().configure();SessionFactory 概述:應(yīng)用程序從概述:應(yīng)用程序從SessionFactory(會(huì)話工廠)里獲得會(huì)話工廠)里獲得Session(會(huì)話會(huì)話)實(shí)例。它在多個(gè)應(yīng)用線程間進(jìn)行共享。通常情況下,整個(gè)應(yīng)用只有唯實(shí)例。它在多個(gè)應(yīng)用線程間進(jìn)行共享。通常情況下,整個(gè)應(yīng)用只有唯一的一個(gè)會(huì)話工廠一的一個(gè)會(huì)話工廠例如在應(yīng)用初始化時(shí)被創(chuàng)建。然而,如果你使例如在應(yīng)用初始化時(shí)被創(chuàng)建。然而,如果你使用用Hibernate訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),你需要對(duì)每一個(gè)數(shù)據(jù)庫(kù)使用一個(gè)會(huì)話工訪問(wèn)多個(gè)數(shù)據(jù)庫(kù),你需要對(duì)每一個(gè)數(shù)據(jù)

19、庫(kù)使用一個(gè)會(huì)話工廠。廠。 會(huì)話工廠緩存了生成的會(huì)話工廠緩存了生成的SQL語(yǔ)句和語(yǔ)句和Hibernate在運(yùn)行時(shí)使用的映射元數(shù)在運(yùn)行時(shí)使用的映射元數(shù)據(jù)。據(jù)。 調(diào)用代碼:調(diào)用代碼:SessionFactory sessionFactory = cfg.buildSessionFactory(); 說(shuō)明:說(shuō)明:SessionFactory由由Configuration對(duì)象創(chuàng)建,所以每個(gè)對(duì)象創(chuàng)建,所以每個(gè)Hibernate配置文件,實(shí)際上是對(duì)配置文件,實(shí)際上是對(duì)SessionFactory的配置的配置Session(會(huì)話)(會(huì)話) 概述:概述:q Session不是線程安全的,它代表與數(shù)據(jù)庫(kù)之間的一次

20、操作,它的概不是線程安全的,它代表與數(shù)據(jù)庫(kù)之間的一次操作,它的概念介于念介于Connection和和Transaction之間。之間。q Session也稱為持久化管理器,因?yàn)樗桥c持久化有關(guān)的操作接口。也稱為持久化管理器,因?yàn)樗桥c持久化有關(guān)的操作接口。q Session通過(guò)通過(guò)SessionFactory打開,所有的工作完成后,需要關(guān)閉。打開,所有的工作完成后,需要關(guān)閉。q 它與它與Web層的層的HttpSession沒(méi)有任何關(guān)系。沒(méi)有任何關(guān)系。 調(diào)用代碼調(diào)用代碼Session session = sessionFactory.openSession();持久化對(duì)象的狀態(tài)持久化對(duì)象的狀態(tài)

21、瞬時(shí)對(duì)象瞬時(shí)對(duì)象( (Transient Objects)Transient Objects):使用new 操作符初始化的對(duì)象不是立刻就持久的。它們的狀態(tài)是瞬時(shí)的,也就是說(shuō)它們沒(méi)有任何跟數(shù)據(jù)庫(kù)表相關(guān)聯(lián)的行為,只要應(yīng)用不再引用這些對(duì)象(不再被任何其它對(duì)象所引用),它們的狀態(tài)將會(huì)丟失,并由垃圾回收機(jī)制回收。 持久化對(duì)象持久化對(duì)象( (Persist Objects)Persist Objects):持久實(shí)例是任何具有數(shù)據(jù)庫(kù)標(biāo)識(shí)的實(shí)例。它有持久化管理器Session統(tǒng)一管理,持久實(shí)例是在事務(wù)中進(jìn)行操作的它們的狀態(tài)在事務(wù)結(jié)束時(shí)同數(shù)據(jù)庫(kù)進(jìn)行同步。當(dāng)事務(wù)提交時(shí),通過(guò)執(zhí)行SQL的INSERT、UPDATE和

22、DELETE語(yǔ)句把內(nèi)存中的狀態(tài)同步到數(shù)據(jù)庫(kù)中。離線對(duì)象離線對(duì)象( (Detached ObjectsDetached Objects) ):Session關(guān)閉之后,持久化對(duì)象就變?yōu)殡x線對(duì)象。離線表示這個(gè)對(duì)象不能再與數(shù)據(jù)庫(kù)保持同步,它們不再受Hibernate管理。持久化對(duì)象的生命周期(持久化對(duì)象的生命周期(lifecycle)Transaction(事務(wù))(事務(wù)) 概述:概述: 它將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來(lái)它將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來(lái)這可能是一個(gè)這可能是一個(gè)JDBC事務(wù),一個(gè)事務(wù),一個(gè)JTA用戶事務(wù)或者甚至是一個(gè)公共對(duì)象請(qǐng)求代理結(jié)構(gòu)(用戶事務(wù)或者甚至是一個(gè)公共對(duì)象請(qǐng)求代理結(jié)

23、構(gòu)(CORBA)允許應(yīng)用通過(guò)一組一致的允許應(yīng)用通過(guò)一組一致的API控制事務(wù)邊界。這有助于控制事務(wù)邊界。這有助于保持保持Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。 調(diào)用代碼:調(diào)用代碼: Transaction tx = session.beginTransaction();v 注:使用注:使用Hibernate進(jìn)行操作時(shí)必須顯式的調(diào)用進(jìn)行操作時(shí)必須顯式的調(diào)用Transaction(默認(rèn):默認(rèn):autoCommit=false)。)。從代碼中體會(huì)從代碼中體會(huì)Session和和TransactionSession session = f

24、actory.openSession();session.beginTransaction();User user = new User();user.setName(“張三張三);user.setPassword(“zhangsan);user.setCreateTime(new Date();user.setExpireTime(new Date();session.save(user);session.getTransaction().commit();session.beginTransaction();User userNew = new User();userNew.setName

25、(“李四李四);session.save(userNew);session.getTransaction().commit();if(session.isOpen()session.close();Query 概述:概述:Query(查詢)接口允許你在數(shù)據(jù)庫(kù)上執(zhí)行查詢并控制查詢?nèi)绾螆?zhí)行。查詢)接口允許你在數(shù)據(jù)庫(kù)上執(zhí)行查詢并控制查詢?nèi)绾螆?zhí)行。查詢語(yǔ)句使用查詢語(yǔ)句使用HQL或者本地?cái)?shù)據(jù)庫(kù)的或者本地?cái)?shù)據(jù)庫(kù)的SQL方言編寫。方言編寫。 調(diào)用代碼:調(diào)用代碼:Query query = session.createQuery(“from User”); 關(guān)于關(guān)于HQL,后面課程中,將會(huì)介紹,后面課程中,將

26、會(huì)介紹Query 舉例舉例Configuration cfg = new Configuration().configure();SessionFactory factory = cfg.buildSessionFactory();Session session = factory.openSession();session.beginTransaction();Query query = session.createQuery(from User);List users = query.list();for (Iterator iter = users.iterator(); iter.ha

27、sNext();) User user = (User) iter.next();System.out.println(user name = +user.getName();session.getTransaction().commit();if(session.isOpen()session.close();Hibernate的對(duì)象關(guān)系映射的對(duì)象關(guān)系映射映射文件的基本結(jié)構(gòu)舉例映射文件的基本結(jié)構(gòu)舉例 . hibernate-mapping元素元素 可以包含的子元素可以包含的子元素 class 描述被映射的類 subclass/joined-subclass 在繼承關(guān)系的映射中會(huì)用到 quer

28、y 將查詢語(yǔ)句定義在配置文件中 .class元素元素常用屬性常用屬性 name 實(shí)體類的類名實(shí)體類的類名 table 被映射到數(shù)據(jù)庫(kù)表的名稱被映射到數(shù)據(jù)庫(kù)表的名稱可以包含的常見(jiàn)子元素可以包含的常見(jiàn)子元素 id 主鍵定義主鍵定義 property 屬性定義屬性定義 關(guān)系映射定義(一對(duì)多、多對(duì)一等)關(guān)系映射定義(一對(duì)多、多對(duì)一等)主鍵主鍵 id 被映射的類必須要有一個(gè)被映射的類必須要有一個(gè)id定義定義 通常使用邏輯主鍵通常使用邏輯主鍵 邏輯主鍵:沒(méi)有意義的唯一標(biāo)識(shí)符邏輯主鍵:沒(méi)有意義的唯一標(biāo)識(shí)符 業(yè)務(wù)主鍵:有意義的唯一標(biāo)識(shí)符業(yè)務(wù)主鍵:有意義的唯一標(biāo)識(shí)符 Hibernate使用使用generator

29、類來(lái)生成主鍵類來(lái)生成主鍵 Hibernate自帶了很多自帶了很多generator(不同的主鍵生成策略)(不同的主鍵生成策略) int/long native String - uuid 我們也可以定義自己的我們也可以定義自己的generator 實(shí)現(xiàn)實(shí)現(xiàn)IdentifierGenerator接口接口 一般情況下不需要實(shí)現(xiàn)自己的一般情況下不需要實(shí)現(xiàn)自己的generator主鍵生成策略主鍵生成策略generator generator主鍵生成器,每個(gè)主鍵都必須定義相應(yīng)的主鍵生成策略。它用來(lái)為持久主鍵生成器,每個(gè)主鍵都必須定義相應(yīng)的主鍵生成策略。它用來(lái)為持久化類實(shí)例生成唯一的標(biāo)識(shí)?;悓?shí)例生成唯一

30、的標(biāo)識(shí)。 Hibernate內(nèi)置的主鍵生成策略內(nèi)置的主鍵生成策略q 數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制。數(shù)據(jù)庫(kù)提供的主鍵生成機(jī)制。identity、sequence(序列)序列) 。q 外部程序提供的主鍵生成機(jī)制。外部程序提供的主鍵生成機(jī)制。increment (遞增)遞增) ,hilo(高高低位)低位) ,seqhilo(使用序列的高低位使用序列的高低位 ),),uuid.hex(使用了使用了IP地地址址+JVM的啟動(dòng)時(shí)間(精確到的啟動(dòng)時(shí)間(精確到1/4秒)秒)+系統(tǒng)時(shí)間系統(tǒng)時(shí)間+一個(gè)計(jì)數(shù)器值(一個(gè)計(jì)數(shù)器值(在在JVM中唯一)中唯一) ),uuid.string。q 其它。其它。native(本地),

31、本地),assigned(手工指定),手工指定),foreign(外部外部引用)。引用)。普通屬性映射普通屬性映射 - property 可使用的常見(jiàn)屬性如下:可使用的常見(jiàn)屬性如下: name 對(duì)應(yīng)類的屬性名稱對(duì)應(yīng)類的屬性名稱 type 指定屬性的類型,一般情況下可以不用指定,由指定屬性的類型,一般情況下可以不用指定,由hibernate自動(dòng)匹配(可參考文檔中的有關(guān)說(shuō)明)自動(dòng)匹配(可參考文檔中的有關(guān)說(shuō)明) length 指定長(zhǎng)度指定長(zhǎng)度 column 指定屬性所對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段的名稱,如果不指定,指定屬性所對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段的名稱,如果不指定,就是屬性的名稱就是屬性的名稱Hibernate-復(fù)合

32、主鍵復(fù)合主鍵復(fù)合主鍵是由多個(gè)字段一起組成,以此來(lái)構(gòu)成唯一鍵值。復(fù)合主鍵是由多個(gè)字段一起組成,以此來(lái)構(gòu)成唯一鍵值。假設(shè)實(shí)現(xiàn)一個(gè)游戲的注冊(cè)功能。假設(shè)實(shí)現(xiàn)一個(gè)游戲的注冊(cè)功能。UserUser表來(lái)存放用戶信息,表來(lái)存放用戶信息,GameGame表來(lái)存放游戲信息,表來(lái)存放游戲信息,RegisterRegister表存放注冊(cè)信息。一個(gè)表存放注冊(cè)信息。一個(gè)人可以注冊(cè)多個(gè)不同游戲,但是同一個(gè)人不允許重復(fù)注冊(cè)人可以注冊(cè)多個(gè)不同游戲,但是同一個(gè)人不允許重復(fù)注冊(cè)同一個(gè)游戲。同一個(gè)游戲。Hibernate-復(fù)合主鍵復(fù)合主鍵Hibernate-復(fù)合主鍵復(fù)合主鍵Hibernate-復(fù)合主鍵復(fù)合主鍵Hibernate-復(fù)合

33、主鍵復(fù)合主鍵關(guān)聯(lián)映射關(guān)聯(lián)映射 一對(duì)多一對(duì)多 多對(duì)一多對(duì)一 一對(duì)一一對(duì)一 多對(duì)多多對(duì)多多對(duì)一關(guān)聯(lián)映射多對(duì)一關(guān)聯(lián)映射 many-to-one User-Group User-Group 多個(gè)用戶屬于某個(gè)組多個(gè)用戶屬于某個(gè)組 從代碼上體現(xiàn)為:從代碼上體現(xiàn)為:public class Group privte String id;private String name;.public class Userprivate String id;privte String name; private Group group;public Group getGroup() return group; publ

34、ic void setGroup(Group group)this.group = group; many-to-one 映射的編寫映射的編寫many-to-one的映射最常用,也是最容易理解和編寫的的映射最常用,也是最容易理解和編寫的生成的生成的DDL語(yǔ)句如下語(yǔ)句如下create table T_Group (id varchar(255) not null, name varchar(255), primary key (id)create table User (id varchar(255) not null, name varchar(255), password varchar(2

35、55), createTime datetime, expireTime datetime, groupid varchar(255), primary key (id)alter table User add index FK285FEBC3D18669 (groupid), add constraint FK285FEBC3D18669 foreign key (groupid) references T_Group (id)從生成的從生成的DDL語(yǔ)句,我們可以知道,實(shí)際上是在語(yǔ)句,我們可以知道,實(shí)際上是在User表上建立了一個(gè)表上建立了一個(gè)指向指向Group表的外鍵關(guān)聯(lián)表的外鍵關(guān)聯(lián)重要屬

36、性重要屬性cascade重要屬性重要屬性 cascade(級(jí)聯(lián))(級(jí)聯(lián)) 級(jí)聯(lián)的意思是指定兩個(gè)對(duì)象之間的操作聯(lián)動(dòng)關(guān)系,對(duì)一個(gè)對(duì)象執(zhí)行級(jí)聯(lián)的意思是指定兩個(gè)對(duì)象之間的操作聯(lián)動(dòng)關(guān)系,對(duì)一個(gè)對(duì)象執(zhí)行了操作之后,對(duì)其指定的級(jí)聯(lián)對(duì)象也需要執(zhí)行相同的操作了操作之后,對(duì)其指定的級(jí)聯(lián)對(duì)象也需要執(zhí)行相同的操作 總共可以取值為:總共可以取值為:all、none、save-update、delete all-代表在所有的情況下都執(zhí)行級(jí)聯(lián)操作代表在所有的情況下都執(zhí)行級(jí)聯(lián)操作 none-在所有情況下都不執(zhí)行級(jí)聯(lián)操作在所有情況下都不執(zhí)行級(jí)聯(lián)操作 save-update-在保存和更新的時(shí)候執(zhí)行級(jí)聯(lián)操作在保存和更新的時(shí)候執(zhí)行級(jí)

37、聯(lián)操作 delete-在刪除的時(shí)候執(zhí)行級(jí)聯(lián)操作在刪除的時(shí)候執(zhí)行級(jí)聯(lián)操作如:如:編寫實(shí)際例子測(cè)試編寫實(shí)際例子測(cè)試many-to-one以及以及cascade屬性的配置屬性的配置cascade實(shí)際上意味著什么?實(shí)際上意味著什么? 無(wú)無(wú)cascade配置的配置的User-Group執(zhí)行代碼配置執(zhí)行代碼配置代碼:代碼:Group group = new Group();group.setName(“tom);User user = new User();user.setName(“張三張三);user.setGroup(group);session.save(user);執(zhí)行結(jié)果:執(zhí)行結(jié)果:拋出拋出o

38、rg.hibernate.TransientObjectException異常,以上代碼中,異常,以上代碼中,group對(duì)象是一個(gè)瞬時(shí)對(duì)象,對(duì)象是一個(gè)瞬時(shí)對(duì)象,user對(duì)象引用了一個(gè)瞬時(shí)對(duì)象,所以在保對(duì)象引用了一個(gè)瞬時(shí)對(duì)象,所以在保存的時(shí)候出現(xiàn)異常。存的時(shí)候出現(xiàn)異常。無(wú)無(wú)cascade配置時(shí)正確的配置時(shí)正確的java執(zhí)行代碼執(zhí)行代碼為避免異常,我們可以需要將為避免異常,我們可以需要將group對(duì)象保存對(duì)象保存Group group = new Group();group.setName(“tom);session.save(group);User user = new User();user.

39、setName(“張三張三);user.setGroup(group);session.save(user);添加添加cascade配置配置下面的代碼(最初的代碼)下面的代碼(最初的代碼)Group group = new Group();group.setName(“tom);User user = new User();user.setName(“張三張三);user.setGroup(group);session.save(user);可正確執(zhí)行可正確執(zhí)行cascade配置,使得配置,使得hibernate在管理對(duì)象的時(shí)候,對(duì)在管理對(duì)象的時(shí)候,對(duì)cascade對(duì)象執(zhí)行對(duì)象執(zhí)行了級(jí)聯(lián)操作。

40、了級(jí)聯(lián)操作。一對(duì)一關(guān)聯(lián)映射一對(duì)一關(guān)聯(lián)映射 (one-to-one) 兩個(gè)對(duì)象之間是一對(duì)一的關(guān)系,如兩個(gè)對(duì)象之間是一對(duì)一的關(guān)系,如 Person-Person-IdCardIdCard 有兩種策略可以實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)映射有兩種策略可以實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)映射 主鍵關(guān)聯(lián):即讓兩個(gè)對(duì)象具有相同的主鍵值,以表明它們之間的主鍵關(guān)聯(lián):即讓兩個(gè)對(duì)象具有相同的主鍵值,以表明它們之間的一一對(duì)應(yīng)的關(guān)系;數(shù)據(jù)庫(kù)表不會(huì)有額外的字段來(lái)維護(hù)它們之間的一一對(duì)應(yīng)的關(guān)系;數(shù)據(jù)庫(kù)表不會(huì)有額外的字段來(lái)維護(hù)它們之間的關(guān)系,僅通過(guò)表的主鍵來(lái)關(guān)聯(lián)關(guān)系,僅通過(guò)表的主鍵來(lái)關(guān)聯(lián) 唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián),本來(lái)是用于多對(duì)一的配置,但是如果唯一外鍵關(guān)聯(lián)

41、:外鍵關(guān)聯(lián),本來(lái)是用于多對(duì)一的配置,但是如果加上唯一的限制之后,也可以用來(lái)表示一對(duì)一關(guān)聯(lián)關(guān)系;加上唯一的限制之后,也可以用來(lái)表示一對(duì)一關(guān)聯(lián)關(guān)系;Hibernate- one-to-one-主鍵關(guān)聯(lián)主鍵關(guān)聯(lián)Hibernate- one-to-one-主鍵關(guān)聯(lián)主鍵關(guān)聯(lián)Hibernate- one-to-one-主鍵關(guān)聯(lián)主鍵關(guān)聯(lián)一對(duì)一一對(duì)一 ( (主鍵關(guān)聯(lián)映射主鍵關(guān)聯(lián)映射) )Person類類public class Person private int id; private IdCard idCard; .映射文件映射文件 idCard . IdCard類類public class IdCard

42、 private int id; private Person person; 映射文件映射文件 . Hibernate- one-to-one-外鍵關(guān)聯(lián)外鍵關(guān)聯(lián)Hibernate- one-to-one-外鍵關(guān)聯(lián)外鍵關(guān)聯(lián)Hibernate- one-to-one-外鍵關(guān)聯(lián)外鍵關(guān)聯(lián)一對(duì)一一對(duì)一 (唯一外鍵關(guān)聯(lián)映射)(唯一外鍵關(guān)聯(lián)映射)Mankind類類public class Mankind private String id;private String name;private Nose nose;關(guān)聯(lián)映射關(guān)聯(lián)映射 Nose類類public class Nose private Strin

43、g id;private Mankind mankind;關(guān)聯(lián)映射關(guān)聯(lián)映射 property-ref:在這種情況下,必須指定在這種情況下,必須指定此屬性,它表示本類(此屬性,它表示本類(NoseNose)的主鍵將會(huì))的主鍵將會(huì)與關(guān)聯(lián)類(與關(guān)聯(lián)類(MankindMankind)的此屬性)的此屬性(nose)(nose)相對(duì)相對(duì)應(yīng)應(yīng)一對(duì)多關(guān)聯(lián)映射一對(duì)多關(guān)聯(lián)映射 (one-to-many)在對(duì)象模型中,一對(duì)多的關(guān)聯(lián)關(guān)系,使用集合來(lái)表示在對(duì)象模型中,一對(duì)多的關(guān)聯(lián)關(guān)系,使用集合來(lái)表示比如比如Classes(班級(jí))和(班級(jí))和Student(學(xué)生)之間是一對(duì)多的關(guān)系(學(xué)生)之間是一對(duì)多的關(guān)系public

44、class Classes private String id;private String name;private Set students;.public class Student private String id;private String name; .一對(duì)多關(guān)聯(lián)映射文件一對(duì)多關(guān)聯(lián)映射文件Classes映射文件映射文件 關(guān)于關(guān)于lazy屬性屬性lazy lazy 延遲加載(懶加載),一般用于集合的抓取策略,也就是說(shuō)只延遲加載(懶加載),一般用于集合的抓取策略,也就是說(shuō)只在需要用到的情況下,再發(fā)出在需要用到的情況下,再發(fā)出selectselect語(yǔ)句,將其相關(guān)的對(duì)象查詢出來(lái)語(yǔ)句,

45、將其相關(guān)的對(duì)象查詢出來(lái)setset默認(rèn)默認(rèn)lazylazy屬性的值是屬性的值是truetrue,即,即hibernatehibernate會(huì)自動(dòng)使用懶加載策略,會(huì)自動(dòng)使用懶加載策略,以提高性能以提高性能舉例說(shuō)明舉例說(shuō)明 關(guān)于關(guān)于inverse屬性屬性inverse 標(biāo)記由哪一方來(lái)維護(hù)關(guān)聯(lián)關(guān)系(雙向關(guān)聯(lián)中會(huì)用到)標(biāo)記由哪一方來(lái)維護(hù)關(guān)聯(lián)關(guān)系(雙向關(guān)聯(lián)中會(huì)用到) inverse默認(rèn)值為默認(rèn)值為false 如果如果inverse設(shè)置為設(shè)置為true,表示將由對(duì)方維護(hù)兩者之間的關(guān)聯(lián)關(guān)系,表示將由對(duì)方維護(hù)兩者之間的關(guān)聯(lián)關(guān)系舉例說(shuō)明舉例說(shuō)明 多對(duì)多關(guān)聯(lián)映射多對(duì)多關(guān)聯(lián)映射 (many-to-many) 一般的

46、設(shè)計(jì)中,多對(duì)多關(guān)聯(lián)映射,需要一個(gè)中間表一般的設(shè)計(jì)中,多對(duì)多關(guān)聯(lián)映射,需要一個(gè)中間表 Hibernate會(huì)自動(dòng)生成中間表會(huì)自動(dòng)生成中間表 Hibernate使用使用many-to-many標(biāo)簽來(lái)表示多對(duì)多的關(guān)聯(lián)標(biāo)簽來(lái)表示多對(duì)多的關(guān)聯(lián) 多對(duì)多的關(guān)聯(lián)映射,在實(shí)體類中,跟一對(duì)多一樣,也是用多對(duì)多的關(guān)聯(lián)映射,在實(shí)體類中,跟一對(duì)多一樣,也是用集合來(lái)表示的集合來(lái)表示的Hibernate-many-to-many表之間多對(duì)多的關(guān)聯(lián),通常借助中間表來(lái)實(shí)現(xiàn),在實(shí)際表之間多對(duì)多的關(guān)聯(lián),通常借助中間表來(lái)實(shí)現(xiàn),在實(shí)際的項(xiàng)目開發(fā)中也會(huì)經(jīng)常碰到。的項(xiàng)目開發(fā)中也會(huì)經(jīng)常碰到。示例:示例:假設(shè)實(shí)現(xiàn)一個(gè)員工薪金計(jì)算,假設(shè)實(shí)現(xiàn)一個(gè)員

47、工薪金計(jì)算,EmployeeEmployee表存放員工信息,表存放員工信息,WelfareWelfare表表存放福利項(xiàng)目信息,存放福利項(xiàng)目信息,SalarySalary表存放員工薪金信息,一個(gè)員工可以擁表存放員工薪金信息,一個(gè)員工可以擁有多項(xiàng)福利,一項(xiàng)福利可以被多個(gè)員工擁有。有多項(xiàng)福利,一項(xiàng)福利可以被多個(gè)員工擁有。SalarySalary表用來(lái)保存這表用來(lái)保存這些關(guān)聯(lián)關(guān)系。些關(guān)聯(lián)關(guān)系。Hibernate-many-to-manyHibernate-many-to-manyHibernate-many-to-manyHibernate-many-to-many運(yùn)行結(jié)果:運(yùn)行結(jié)果:many-to-

48、many配置:配置:(1) column(必需必需): 中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段(2) class (必需必需): 類名,關(guān)聯(lián)目標(biāo)類類名,關(guān)聯(lián)目標(biāo)類 (1)(1) column(必需必需):當(dāng)前表的關(guān)聯(lián)字段當(dāng)前表的關(guān)聯(lián)字段例子例子(many to many):student-trainClass繼繼 承承 繼承實(shí)現(xiàn)的三種策略繼承實(shí)現(xiàn)的三種策略q 單表繼承。每棵類繼承樹使用一個(gè)表單表繼承。每棵類繼承樹使用一個(gè)表(table per class hierarchy) q 具體表繼承。每個(gè)子類一個(gè)表具體表繼承。每個(gè)子類一個(gè)表(table per subcl

49、ass) q 類表繼承。每個(gè)具體類一個(gè)表類表繼承。每個(gè)具體類一個(gè)表(table per concrete class)(有一有一些限制)些限制)每個(gè)類繼承樹對(duì)應(yīng)一張表每個(gè)類繼承樹對(duì)應(yīng)一張表因?yàn)轭惱^承樹肯定是對(duì)應(yīng)多個(gè)類,要把多個(gè)類的信息存放在一張表中,因?yàn)轭惱^承樹肯定是對(duì)應(yīng)多個(gè)類,要把多個(gè)類的信息存放在一張表中,必須有某種機(jī)制來(lái)區(qū)分哪些記錄是屬于哪個(gè)類的。這種機(jī)制就是,在表必須有某種機(jī)制來(lái)區(qū)分哪些記錄是屬于哪個(gè)類的。這種機(jī)制就是,在表中添加一個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行區(qū)分。用中添加一個(gè)字段,用這個(gè)字段的值來(lái)進(jìn)行區(qū)分。用hibernate實(shí)現(xiàn)這種策實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:略的時(shí)候,有如下

50、步驟:父類用普通的父類用普通的標(biāo)簽定義標(biāo)簽定義在父類中定義一個(gè)在父類中定義一個(gè)discriminator,即指定這個(gè)區(qū)分的字段的名稱和類型,即指定這個(gè)區(qū)分的字段的名稱和類型 如:子類使用子類使用標(biāo)簽定義,在定義標(biāo)簽定義,在定義subclass的時(shí)候,需要注意如的時(shí)候,需要注意如下幾點(diǎn):下幾點(diǎn): Subclass標(biāo)簽的name屬性是子類的全路徑名 在Subclass標(biāo)簽中,用discriminator-value屬性來(lái)標(biāo)明本子類的discriminator字段(用來(lái)區(qū)分不同類的字段)的值 Subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類之間的繼承關(guān)系),也可以與cla

51、ss標(biāo)簽平行。 當(dāng)subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。 子類的其它屬性,像普通類一樣,定義在subclass標(biāo)簽的內(nèi)部。每個(gè)子類一張表每個(gè)子類一張表(除非將父類定義成抽象的,否則父類也是一張表)(除非將父類定義成抽象的,否則父類也是一張表)這種策略是使用這種策略是使用joined-subclass標(biāo)簽來(lái)定義子類的。父類、子類,每個(gè)標(biāo)簽來(lái)定義子類的。父類、子類,每個(gè)類都對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表。在父類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)際上會(huì)存儲(chǔ)所有的類都對(duì)應(yīng)一張數(shù)據(jù)庫(kù)表。在父類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,實(shí)際上會(huì)存儲(chǔ)所有的記錄,

52、包括父類和子類的記錄;在子類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,這個(gè)表只定義記錄,包括父類和子類的記錄;在子類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表中,這個(gè)表只定義了子類中所特有的屬性映射的字段。子類與父類,通過(guò)相同的主鍵值來(lái)關(guān)了子類中所特有的屬性映射的字段。子類與父類,通過(guò)相同的主鍵值來(lái)關(guān)聯(lián)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:聯(lián)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:父類用普通的父類用普通的標(biāo)簽定義即可標(biāo)簽定義即可父類不再需要定義父類不再需要定義discriminator字段字段子類用子類用標(biāo)簽定義,在定義標(biāo)簽定義,在定義joined-subclass的時(shí)候,需的時(shí)候,需要注意如下幾點(diǎn):要注意如下幾點(diǎn): Joined-subclass標(biāo)簽的

53、name屬性是子類的全路徑名 Joined-subclass標(biāo)簽需要包含一個(gè)key標(biāo)簽,這個(gè)標(biāo)簽指定了子類和父類之間是通過(guò)哪個(gè)字段來(lái)關(guān)聯(lián)的。如:,這里的column,實(shí)際上就是父類的主鍵對(duì)應(yīng)的映射字段名稱。 Joined-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Joined-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Joined-subclass標(biāo)簽中,添加extends屬性,里面的值是父類全路徑名稱。 子類的其它屬性,像普通類一樣,定義在joined-subclass標(biāo)簽內(nèi)。每個(gè)具體子類一

54、張表這種策略是使用這種策略是使用union-subclass標(biāo)簽來(lái)定義子類的。每個(gè)子類對(duì)應(yīng)一張表,標(biāo)簽來(lái)定義子類的。每個(gè)子類對(duì)應(yīng)一張表,而且這個(gè)表的信息是完備的,即包含了所有從父類繼承下來(lái)的屬性映射的字而且這個(gè)表的信息是完備的,即包含了所有從父類繼承下來(lái)的屬性映射的字段(這就是它跟段(這就是它跟joined-subclass的不同之處,的不同之處,joined-subclass定義的子類定義的子類的表,只包含子類特有屬性映射的字段)。的表,只包含子類特有屬性映射的字段)。實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:實(shí)現(xiàn)這種策略的時(shí)候,有如下步驟:父類用普通父類用普通標(biāo)簽定義即可標(biāo)簽定義即可子類用子類用標(biāo)簽

55、定義,在定義標(biāo)簽定義,在定義union-subclass的時(shí)候,需要的時(shí)候,需要注意如下幾點(diǎn):注意如下幾點(diǎn): Union-subclass標(biāo)簽不再需要包含key標(biāo)簽(與joined-subclass不同) Union-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Union-subclass標(biāo)簽的定義與class標(biāo)簽平行的時(shí)候,需要在Union-subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。 子類的其它屬性,像普通類一樣,定義在Union-subclass標(biāo)簽的內(nèi)部。這個(gè)時(shí)候,雖然在u

56、nion-subclass里面定義的只有子類的屬性,但是因?yàn)樗^承了父類,所以,不需要定義其它的屬性,在映射到數(shù)據(jù)庫(kù)表的時(shí)候,依然包含了父類的所有屬性的映射字段。雙向關(guān)聯(lián)雙向關(guān)聯(lián) 概念:雙向關(guān)聯(lián)允許通過(guò)關(guān)聯(lián)的任一端訪問(wèn)另外一端。在概念:雙向關(guān)聯(lián)允許通過(guò)關(guān)聯(lián)的任一端訪問(wèn)另外一端。在HibernateHibernate中中, , 支持兩種類型的雙向關(guān)聯(lián)。支持兩種類型的雙向關(guān)聯(lián)。q 一對(duì)多(一對(duì)多(one-to-one-to-manymany),),SetSet或者或者bagbag值在一端值在一端, , 單單獨(dú)值獨(dú)值( (非集合非集合) )在另外一端在另外一端 。q 多對(duì)多(多對(duì)多(many-to-

57、manymany-to-many),),兩端都是兩端都是setset或或bagbag值。值。例子例子(雙向關(guān)聯(lián)雙向關(guān)聯(lián)):group-user 例:從代碼看例:從代碼看group-usergroup-user雙向關(guān)聯(lián)的雙向關(guān)聯(lián)的inverseinverse 概念:概念:inverse用來(lái)標(biāo)識(shí)雙向關(guān)聯(lián)的用來(lái)標(biāo)識(shí)雙向關(guān)聯(lián)的關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系由哪一端維護(hù)。默認(rèn)由哪一端維護(hù)。默認(rèn)inverse的值為的值為false,由主動(dòng)方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系;如果設(shè)為由主動(dòng)方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系;如果設(shè)為true,則由反向一端維護(hù)關(guān)聯(lián)關(guān)系。則由反向一端維護(hù)關(guān)聯(lián)關(guān)系。 用例:我們假設(shè)已經(jīng)有一個(gè)用例:我們假設(shè)已經(jīng)有一個(gè)Group

58、類的實(shí)例:類的實(shí)例:adminGroup,現(xiàn)在我現(xiàn)在我們要新增一個(gè)用戶,并且將用戶分配到們要新增一個(gè)用戶,并且將用戶分配到adminGroup中。中。q inverse=“false”,由主動(dòng)方Group負(fù)責(zé)維護(hù)group-user的關(guān)聯(lián)關(guān)系.User user = new User(“Jak”);adminGroup.getUsers.add(user);session.save(user);session.update(group);q inverse=“true”,由Group的反向段User負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系。User user = new User(“Jak”);user .setGr

59、oup(adminGroup);session.save(user);Hibernate查詢查詢 概述:概述:數(shù)據(jù)查詢與檢索是Hibernate中的一個(gè)亮點(diǎn)。相對(duì)其他ORM實(shí)現(xiàn)而言,Hibernate提供了靈活多樣的查詢機(jī)制。q 標(biāo)準(zhǔn)化對(duì)象查詢標(biāo)準(zhǔn)化對(duì)象查詢(Criteria Query):以對(duì)象的方式進(jìn)行查詢,將查詢語(yǔ)句封裝為對(duì)象操作。優(yōu)點(diǎn):可讀性好,符合Java 程序員的編碼習(xí)慣。缺點(diǎn):不夠成熟,不支持投影(projection)或統(tǒng)計(jì)函數(shù)(aggregation)q Hibernate語(yǔ)言查詢(Hibernate Query Language,HQL):它是完全面向?qū)ο蟮牟樵冋Z(yǔ)句,查詢功

60、能非常強(qiáng)大,具備多態(tài)、關(guān)聯(lián)等特性 。Hibernate官方推薦使用HQL進(jìn)行查詢。q Native SQL Queries(原生原生SQL查詢)查詢):直接使用標(biāo)準(zhǔn)SQL語(yǔ)言或跟特定數(shù)據(jù)庫(kù)相關(guān)的SQL進(jìn)行查詢。例子:標(biāo)準(zhǔn)化對(duì)象查詢例子:標(biāo)準(zhǔn)化對(duì)象查詢(Criteria Query)(Criteria Query) 簡(jiǎn)單例子:簡(jiǎn)單例子:查詢用戶名以“J”開頭的所有用戶。 Criteria criteria = session.createCriteria(User.class); criteria.add(Expression.like(name,J%); List users = criter

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論