版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Hibernate開源O/R映射框架課程目標(biāo)課程目標(biāo):理解O/R Mapping原理掌握Hibernate開發(fā)的相關(guān)知識能使用Hibernate進(jìn)行實(shí)際項目開發(fā)Hibernate高手進(jìn)級:性能優(yōu)化策略目錄什么是Hibernate快速體驗Hibernate的開發(fā)步驟認(rèn)識Hibernate基本核心接口Hibernate的對象關(guān)系映射Hibernate查詢語句(HQL)Hibernate?直接使用JDBC操作數(shù)據(jù)庫的步驟很繁瑣JDBC操作的是關(guān)系型數(shù)據(jù)庫我們用JAVA開發(fā)程序,則使用面向?qū)ο蟮乃枷際ibernate正是在這兩種不同的模型之間建立關(guān)聯(lián),Hibernate給我們提供了利用面向?qū)ο蟮乃枷雭?/p>
2、操作關(guān)系型數(shù)據(jù)的接口什么是關(guān)系模型(Relational Model)?關(guān)系模型把世界看作是由實(shí)體(Entity)和聯(lián)系(Relationship)構(gòu)成的。 所謂實(shí)體就是指現(xiàn)實(shí)世界中具有區(qū)分與其它事物的特征或?qū)傩圆⑴c其它實(shí)體有聯(lián)系的對象。在關(guān)系模型中實(shí)體通常是以表的形式來表現(xiàn)的。表的每一行描述實(shí)體的一個實(shí)例,表的每一列描述實(shí)體的一個特征或?qū)傩浴?所謂聯(lián)系就是指實(shí)體之間的關(guān)系,即實(shí)體之間的對應(yīng)關(guān)系。 1:1 1:nm:n 關(guān)系數(shù)據(jù)庫表字段主鍵外鍵什么是面向?qū)ο??面向?qū)ο笕筇卣鳎悍庋b、繼承(一般與特殊)、多態(tài)(覆蓋與重載)類對象屬性關(guān)系一般與特殊關(guān)系(is a)組成(has a)關(guān)聯(lián)及其多重性1
3、:11:nm:n雙向關(guān)聯(lián)與單向關(guān)聯(lián)對象關(guān)系映射(Object Relational Mapping,簡稱ORM) ORM是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。簡單的說,ORM是通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù),將java程序中的對象自動持久化到關(guān)系數(shù)據(jù)庫中。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。 Why ORM?面向?qū)ο蟮拈_發(fā)方法是當(dāng)今企業(yè)級應(yīng)用開發(fā)環(huán)境中的主流開發(fā)方法 關(guān)系數(shù)據(jù)庫是企業(yè)級應(yīng)用環(huán)境中永久存放數(shù)據(jù)的主流數(shù)據(jù)存儲系統(tǒng) 字母O起源于“對象”(Object),而R則來自于“關(guān)系”(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數(shù)據(jù)庫
4、。在業(yè)務(wù)邏輯層和呈現(xiàn)層中,我們是面向?qū)ο蟮?。?dāng)對象信息發(fā)生變化的時候,我們需要把對象的信息保存在關(guān)系數(shù)據(jù)庫中。 當(dāng)你開發(fā)一個應(yīng)用程序的時候(不使用O/R Mapping),你可能會寫不少數(shù)據(jù)訪問層的代碼,用來從數(shù)據(jù)庫保存,刪除,讀取對象信息,等等。而這些代碼寫起來總是重復(fù)的。 對象關(guān)系映射模式屬性映射類映射關(guān)聯(lián)映射一對一一對多多對多什么是Hibernate?對象/關(guān)系映射一直都是數(shù)據(jù)庫技術(shù)中的難點(diǎn),盡管人們提出了許多方案解決這個問題,但都不能完全做到即便利又高效。EJB的推出讓人們看到了希望,但實(shí)踐證明實(shí)體Bean的效率并不高,并且還十分難于為初學(xué)者理解。由Gavin King創(chuàng)建的Hiber
5、nate框架,從某種程序上正在朝著正確的方向邁走,并且得到越來越多IT從業(yè)人員的認(rèn)可。就像當(dāng)年的Struts框架一樣,Hibernate也已經(jīng)在許多項目中得到廣泛應(yīng)用。Hibernate由于投注了更多的精力在提升效率上,使用起來又十分方便,新版的EJB規(guī)范正在向Hibernate方向靠攏。正是由于得到廣泛的認(rèn)可,Hibernate已經(jīng)成為程序員必須掌握的技術(shù)之一。Hibernate能做什么? - 理解O/R映射Hibernate能幫助我們利用面向?qū)ο蟮乃枷?,開發(fā)基于關(guān)系型數(shù)據(jù)庫的應(yīng)用程序第一:將對象數(shù)據(jù)保存到數(shù)據(jù)庫第二:將數(shù)據(jù)庫數(shù)據(jù)讀入對象中基于B/S的典型三層架構(gòu)關(guān)于分層 業(yè)務(wù)邏輯層和持久化
6、層絕對不能依賴于展現(xiàn)層Hibernate與O、R之間的關(guān)系快速體驗Hibernate 安裝以及創(chuàng)建新的項目下載Hibernate,并解壓縮使用Eclipse創(chuàng)建新的項目引入Hibernate及其依賴庫(jar包)引入mysql數(shù)據(jù)庫驅(qū)動包打開mysql控制臺,創(chuàng)建測試數(shù)據(jù)庫”hibernate”Create database hibernate;Use hibernate創(chuàng)建Hibernate配置文件 hibernate.cfg.xml jdbc:mysql:/hibernatecom.mysql.jdbc.Driverrootmysql org.hibernate.dialect.MySQL
7、Dialect 創(chuàng)建持久化類 User.javapublic class User private String id;private String name;private String password;private Date createTime;private Date expireTime;.getters/setters創(chuàng)建類的映射文件 User.hbm.xml 將類的映射文件加入Hibernate為了讓Hibernate能夠處理User對象的持久化,需要將它的映射信息加入到Hibernate中加入的方法很簡單,在Hibernate配置文件中加入:即可resource屬性指定了映
8、射文件的位置和名稱創(chuàng)建數(shù)據(jù)庫表 利用SchemaExport工具類利用Hibernate提供的工具類來創(chuàng)建數(shù)據(jù)庫表創(chuàng)建ExportToDB類public class ExportToDB public static void main(String args) throws Exception/讀取配置文件Configuration cfg = new Configuration().configure();/創(chuàng)建SchemaExport對象SchemaExport export = new SchemaExport(cfg);/創(chuàng)建數(shù)據(jù)庫表export.create(true,true);將
9、對象保存到數(shù)據(jù)庫 UserTest1.javapublic static void main(String args) throws ExceptionConfiguration cfg = new Configuration().configure();SessionFactory factory = cfg.buildSessionFactory();Session session = factory.openSession();session.beginTransaction();User user = new User();user.setName(管理員);user.setPassw
10、ord(admin);user.setCreateTime(new Date();user.setExpireTime(new Date();session.save(user);session.getTransaction() mit();if(session.isOpen()session.close();實(shí)際操作體驗Hibernate開發(fā)步驟按照上面的步驟,先快速體驗一下Hibernate實(shí)際所做的事情Hibernate開發(fā)步驟實(shí)體類(持久化類)的設(shè)計實(shí)體類與關(guān)系數(shù)據(jù)庫的映射應(yīng)用的開發(fā)認(rèn)識Hibernate的基本組件實(shí)體類實(shí)體類映射文件重點(diǎn)學(xué)習(xí)的部分Hibernate配置文件輔助工具Hi
11、bernate核心接口Configuration概述:Configuration 類負(fù)責(zé)管理Hibernate 的配置信息。它包括如下內(nèi)容:Hibernate運(yùn)行的底層信息:數(shù)據(jù)庫的URL、用戶名、密碼、JDBC驅(qū)動類,數(shù)據(jù)庫Dialect,數(shù)據(jù)庫連接池等。Hibernate映射文件(*.hbm.xml)。Hibernate配置的兩種方法:屬性文件(perties)。調(diào)用代碼:Configuration cfg = new Configuration(); Xml文件(hibernate.cfg.xml)。調(diào)用代碼:Configuration cfg = new Configuration()
12、.configure();SessionFactory概述:應(yīng)用程序從SessionFactory(會話工廠)里獲得Session(會話)實(shí)例。它在多個應(yīng)用線程間進(jìn)行共享。通常情況下,整個應(yīng)用只有唯一的一個會話工廠例如在應(yīng)用初始化時被創(chuàng)建。然而,如果你使用Hibernate訪問多個數(shù)據(jù)庫,你需要對每一個數(shù)據(jù)庫使用一個會話工廠。 會話工廠緩存了生成的SQL語句和Hibernate在運(yùn)行時使用的映射元數(shù)據(jù)。調(diào)用代碼:SessionFactory sessionFactory = cfg.buildSessionFactory();說明:SessionFactory由Configuration對象創(chuàng)
13、建,所以每個Hibernate配置文件,實(shí)際上是對SessionFactory的配置Session(會話)概述:Session不是線程安全的,它代表與數(shù)據(jù)庫之間的一次操作,它的概念介于Connection和Transaction之間。 Session也稱為持久化管理器,因為它是與持久化有關(guān)的操作接口。 Session通過SessionFactory打開,在所有的工作完成后,需要關(guān)閉。它與Web層的HttpSession沒有任何關(guān)系。調(diào)用代碼Session session = sessionFactory.openSession();持久化對象的狀態(tài)瞬時對象(Transient Objects)
14、:使用new 操作符初始化的對象不是立刻就持久的。它們的狀態(tài)是瞬時的,也就是說它們沒有任何跟數(shù)據(jù)庫表相關(guān)聯(lián)的行為,只要應(yīng)用不再引用這些對象(不再被任何其它對象所引用),它們的狀態(tài)將會丟失,并由垃圾回收機(jī)制回收。 持久化對象(Persist Objects):持久實(shí)例是任何具有數(shù)據(jù)庫標(biāo)識的實(shí)例。它有持久化管理器Session統(tǒng)一管理,持久實(shí)例是在事務(wù)中進(jìn)行操作的它們的狀態(tài)在事務(wù)結(jié)束時同數(shù)據(jù)庫進(jìn)行同步。當(dāng)事務(wù)提交時,通過執(zhí)行SQL的INSERT、UPDATE和DELETE語句把內(nèi)存中的狀態(tài)同步到數(shù)據(jù)庫中。離線對象(Detached Objects):Session關(guān)閉之后,持久化對象就變?yōu)殡x線對象
15、。離線表示這個對象不能再與數(shù)據(jù)庫保持同步,它們不再受Hibernate管理。持久化對象的生命周期(lifecycle) Transaction(事務(wù))概述: 它將應(yīng)用代碼從底層的事務(wù)實(shí)現(xiàn)中抽象出來這可能是一個JDBC事務(wù),一個JTA用戶事務(wù)或者甚至是一個公共對象請求代理結(jié)構(gòu)(CORBA)允許應(yīng)用通過一組一致的API控制事務(wù)邊界。這有助于保持Hibernate應(yīng)用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。調(diào)用代碼: Transaction tx = session.beginTransaction();注:使用Hibernate進(jìn)行操作時必須顯式的調(diào)用Transaction(默認(rèn): mit=fal
16、se)。從代碼中體會Session和TransactionSession session = factory.openSession();session.beginTransaction();User user = new User();user.setName(管理員);user.setPassword(admin);user.setCreateTime(new Date();user.setExpireTime(new Date();session.save(user);session.getTransaction() mit();session.beginTransaction();Us
17、er user1 = new User();user1.setName(jjj);session.save(user1);session.getTransaction() mit();if(session.isOpen()session.close();Query概述:Query(查詢)接口允許你在數(shù)據(jù)庫上執(zhí)行查詢并控制查詢?nèi)绾螆?zhí)行。查詢語句使用HQL或者本地數(shù)據(jù)庫的SQL方言編寫。調(diào)用代碼:Query query = session.createQuery(“from User”); 關(guān)于HQL,在后續(xù)的課程中,將會介紹Query舉例Configuration cfg = new Confi
18、guration().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.hasNext();) User user = (User) iter.next();S
19、ystem.out.println(user name = +user.getName();session.getTransaction() mit();if(session.isOpen()session.close();Hibernate的對象關(guān)系映射映射文件的基本結(jié)構(gòu)舉例 . hibernate-mapping元素可以包含的子元素class 描述被映射的類subclass/joined-subclass 在繼承關(guān)系的映射中會用到query 將查詢語句定義在配置文件中.class元素常用屬性name 實(shí)體類的類名table 被映射到數(shù)據(jù)庫表的名稱可以包含的常見子元素id 主鍵定義prope
20、rty 屬性定義關(guān)系映射定義(一對多、多對一等)主鍵 id被映射的類必須要有一個id定義通常使用邏輯主鍵邏輯主鍵:沒有意義的唯一標(biāo)識符業(yè)務(wù)主鍵:有意義的唯一標(biāo)識符Hibernate使用generator類來生成主鍵Hibernate自帶了很多generator(不同的主鍵生成策略)int/long nativeString - uuid我們也可以定義自己的generator實(shí)現(xiàn)IdentifierGenerator接口一般情況下不需要實(shí)現(xiàn)自己的generator主鍵生成策略generatorgenerator主鍵生成器,每個主鍵都必須定義相應(yīng)的主鍵生成策略。它用來為持久化類實(shí)例生成唯一的標(biāo)識。
21、Hibernate內(nèi)置的主鍵生成策略數(shù)據(jù)庫提供的主鍵生成機(jī)制。identity、sequence(序列) 。外部程序提供的主鍵生成機(jī)制。increment (遞增) ,hilo(高低位) ,seqhilo(使用序列的高低位 ),uuid.hex(使用了IP地址+JVM的啟動時間(精確到1/4秒)+系統(tǒng)時間+一個計數(shù)器值(在JVM中唯一) ),uuid.string。其它。native(本地),assigned(手工指定),foreign(外部引用)。普通屬性映射 - property可使用的常見屬性如下:name 對應(yīng)類的屬性名稱type 指定屬性的類型,一般情況下可以不用指定,由hibern
22、ate自動匹配(可參考文檔中的有關(guān)說明)length 指定長度column 指定屬性所對應(yīng)的數(shù)據(jù)庫字段的名稱,如果不指定,就是屬性的名稱多對一關(guān)聯(lián)映射 many-to-oneUser-Group 多個用戶屬于某個組從代碼上體現(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;public void setGr
23、oup(Group group)this.group = group; many-to-one映射的編寫many-to-one的映射最常用,也是最容易理解和編寫的生成的DDL語句如下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(255), createTime datetime, expireTime datetim
24、e, groupid varchar(255), primary key (id)alter table User add index FK285FEBC3D18669 (groupid), add constraint FK285FEBC3D18669 foreign key (groupid) references T_Group (id)從生成的DDL語句,我們可以知道,實(shí)際上是在User表上建立了一個指向Group表的外鍵關(guān)聯(lián)重要屬性cascade重要屬性 cascade(級聯(lián))級聯(lián)的意思是指定兩個對象之間的操作聯(lián)動關(guān)系,對一個對象執(zhí)行了操作之后,對其指定的級聯(lián)對象也需要執(zhí)行相同的操作
25、總共可以取值為:all、none、save-update、deleteall-代表在所有的情況下都執(zhí)行級聯(lián)操作none-在所有情況下都不執(zhí)行級聯(lián)操作save-update-在保存和更新的時候執(zhí)行級聯(lián)操作delete-在刪除的時候執(zhí)行級聯(lián)操作如:編寫實(shí)際例子測試many-to-one以及cascade屬性的配置cascade實(shí)際上意味著什么?無cascade配置的User-Group執(zhí)行代碼配置java代碼:Group group = new Group();group.setName(jkjk);User user = new User();user.setName(管理員);user.set
26、Group(group);session.save(user);執(zhí)行結(jié)果:拋出org.hibernate.TransientObjectException異常,以上代碼中,group對象是一個瞬時對象,user對象引用了一個瞬時對象,所以在保存的時候出現(xiàn)異常無cascade配置時正確的java執(zhí)行代碼為避免異常,我們可以需要將group對象保存Group group = new Group();group.setName(jkjk);/執(zhí)行save操作之后,group對象變成持久化對象的狀態(tài)session.save(group);User user = new User();user.setN
27、ame(管理員);user.setGroup(group);session.save(user);添加cascade配置下面的代碼(最初的代碼)Group group = new Group();group.setName(jkjk);User user = new User();user.setName(管理員);user.setGroup(group);session.save(user);可正確執(zhí)行cascade配置,使得hibernate在管理對象的時候,對cascade對象執(zhí)行了級聯(lián)操作一對一關(guān)聯(lián)映射 (one-to-one)兩個對象之間是一對一的關(guān)系,如Person-IdCard有
28、兩種策略可以實(shí)現(xiàn)一對一的關(guān)聯(lián)映射主鍵關(guān)聯(lián):即讓兩個對象具有相同的主鍵值,以表明它們之間的一一對應(yīng)的關(guān)系;數(shù)據(jù)庫表不會有額外的字段來維護(hù)它們之間的關(guān)系,僅通過表的主鍵來關(guān)聯(lián)唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián),本來是用于多對一的配置,但是如果加上唯一的限制之后,也可以用來表示一對一關(guān)聯(lián)關(guān)系;一對一 (主鍵關(guān)聯(lián)映射)Person類public class Person private int id; private IdCard idCard; .映射文件 idCard . IdCard類public class IdCard private int id; private Person person; 映射文
29、件 . 一對一 (唯一外鍵關(guān)聯(lián)映射)Mankind類public class Mankind private String id;private String name;private Nose nose;關(guān)聯(lián)映射 Nose類public class Nose private String id;private Mankind mankind;關(guān)聯(lián)映射 property-ref:在這種情況下,必須指定此屬性,它表示本類(Nose)的主鍵將會與關(guān)聯(lián)類(Mankind)的此屬性(nose)相對應(yīng)一對多關(guān)聯(lián)映射 (one-to-many)在對象模型中,一對多的關(guān)聯(lián)關(guān)系,使用集合來表示比如Classe
30、s(班級)和Student(學(xué)生)之間是一對多的關(guān)系public class Classes private String id;private String name;private Set students;.public class Student private String id;private String name; .一對多關(guān)聯(lián)映射文件Classes映射文件 關(guān)于lazy屬性lazy 延遲加載(懶加載),一般用于集合的抓取策略,也就是說只在需要用到的情況下,再發(fā)出select語句,將其相關(guān)的對象查詢出來set默認(rèn)lazy屬性的值是true,即hibernate會自動使用懶加載策
31、略,以提高性能舉例說明 關(guān)于inverse屬性inverse 標(biāo)記由哪一方來維護(hù)關(guān)聯(lián)關(guān)系(雙向關(guān)聯(lián)中會用到)inverse默認(rèn)值為false如果inverse設(shè)置為true,表示將由對方維護(hù)兩者之間的關(guān)聯(lián)關(guān)系舉例說明 多對多關(guān)聯(lián)映射 (many-to-many)一般的設(shè)計中,多對多關(guān)聯(lián)映射,需要一個中間表Hibernate會自動生成中間表Hibernate使用many-to-many標(biāo)簽來表示多對多的關(guān)聯(lián)多對多的關(guān)聯(lián)映射,在實(shí)體類中,跟一對多一樣,也是用集合來表示的many-to-many(1) column(必需): 中間映射表中,關(guān)聯(lián)目標(biāo)表的關(guān)聯(lián)字段(2) class (必需): 類名,關(guān)
32、聯(lián)目標(biāo)類 (1)(1) column(必需):當(dāng)前表的關(guān)聯(lián)字段例子(many to many):student-trainClass繼承繼承實(shí)現(xiàn)的三種策略單表繼承。每棵類繼承樹使用一個表(table per class hierarchy) 具體表繼承。每個子類一個表(table per subclass) 類表繼承。每個具體類一個表(table per concrete class)(有一些限制)每個類繼承樹對應(yīng)一張表因為類繼承樹肯定是對應(yīng)多個類,要把多個類的信息存放在一張表中,必須有某種機(jī)制來區(qū)分哪些記錄是屬于哪個類的。這種機(jī)制就是,在表中添加一個字段,用這個字段的值來進(jìn)行區(qū)分。用hibe
33、rnate實(shí)現(xiàn)這種策略的時候,有如下步驟:父類用普通的標(biāo)簽定義在父類中定義一個discriminator,即指定這個區(qū)分的字段的名稱和類型如:子類使用標(biāo)簽定義,在定義subclass的時候,需要注意如下幾點(diǎn):Subclass標(biāo)簽的name屬性是子類的全路徑名在Subclass標(biāo)簽中,用discriminator-value屬性來標(biāo)明本子類的discriminator字段(用來區(qū)分不同類的字段)的值Subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)subclass標(biāo)簽的定義與class標(biāo)簽平行的時候,需要在subclas
34、s標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,定義在subclass標(biāo)簽的內(nèi)部。每個子類一張表(除非將父類定義成抽象的,否則父類也是一張表)每一個類一張表這種策略是使用joined-subclass標(biāo)簽來定義子類的。父類、子類,每個類都對應(yīng)一張數(shù)據(jù)庫表。在父類對應(yīng)的數(shù)據(jù)庫表中,實(shí)際上會存儲所有的記錄,包括父類和子類的記錄;在子類對應(yīng)的數(shù)據(jù)庫表中,這個表只定義了子類中所特有的屬性映射的字段。子類與父類,通過相同的主鍵值來關(guān)聯(lián)。實(shí)現(xiàn)這種策略的時候,有如下步驟:父類用普通的標(biāo)簽定義即可父類不再需要定義discriminator字段子類用標(biāo)簽定義,在定義j
35、oined-subclass的時候,需要注意如下幾點(diǎn):Joined-subclass標(biāo)簽的name屬性是子類的全路徑名Joined-subclass標(biāo)簽需要包含一個key標(biāo)簽,這個標(biāo)簽指定了子類和父類之間是通過哪個字段來關(guān)聯(lián)的。如:,這里的column,實(shí)際上就是父類的主鍵對應(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)簽平行的時候,需要在Joined-subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。子
36、類的其它屬性,像普通類一樣,定義在joined-subclass標(biāo)簽的內(nèi)部。每個具體子類一張表這種策略是使用union-subclass標(biāo)簽來定義子類的。每個子類對應(yīng)一張表,而且這個表的信息是完備的,即包含了所有從父類繼承下來的屬性映射的字段(這就是它跟joined-subclass的不同之處,joined-subclass定義的子類的表,只包含子類特有屬性映射的字段)。實(shí)現(xiàn)這種策略的時候,有如下步驟:父類用普通標(biāo)簽定義即可子類用標(biāo)簽定義,在定義union-subclass的時候,需要注意如下幾點(diǎn):Union-subclass標(biāo)簽不再需要包含key標(biāo)簽(與joined-subclass不同)U
37、nion-subclass標(biāo)簽,既可以被class標(biāo)簽所包含(這種包含關(guān)系正是表明了類之間的繼承關(guān)系),也可以與class標(biāo)簽平行。 當(dāng)Union-subclass標(biāo)簽的定義與class標(biāo)簽平行的時候,需要在Union-subclass標(biāo)簽中,添加extends屬性,里面的值是父類的全路徑名稱。子類的其它屬性,像普通類一樣,定義在Union-subclass標(biāo)簽的內(nèi)部。這個時候,雖然在union-subclass里面定義的只有子類的屬性,但是因為它繼承了父類,所以,不需要定義其它的屬性,在映射到數(shù)據(jù)庫表的時候,依然包含了父類的所有屬性的映射字段。雙向關(guān)聯(lián)概念:雙向關(guān)聯(lián)允許通過關(guān)聯(lián)的任一端訪問另
38、外一端。在Hibernate中, 支持兩種類型的雙向關(guān)聯(lián)。一對多(one-to-many),Set或者bag值在一端, 單獨(dú)值(非集合)在另外一端 。多對多(many-to-many),兩端都是set或bag值。例子(雙向關(guān)聯(lián)):group-user 例子:從Java代碼看group-user雙向關(guān)聯(lián)的inverse概念:inverse用來標(biāo)識雙向關(guān)聯(lián)的關(guān)聯(lián)關(guān)系由哪一端維護(hù)。默認(rèn)inverse的值為false,由主動方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系;如果設(shè)為true,則由反向一端維護(hù)關(guān)聯(lián)關(guān)系。用例:我們假設(shè)已經(jīng)有一個Group類的實(shí)例:adminGroup,現(xiàn)在我們要新增一個用戶,并且將用戶分配到admin
39、Group中。inverse=“false”,由主動方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);inverse=“true”,由Group的反向段User負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系。User user = new User(“Jak”);user .setGroup(adminGroup);session.save(user);Hibernate查詢概述:數(shù)據(jù)查詢與檢索是Hibernate中的一個亮點(diǎn)
40、。相對其他ORM實(shí)現(xiàn)而言,Hibernate提供了靈活多樣的查詢機(jī)制。標(biāo)準(zhǔn)化對象查詢(Criteria Query):以對象的方式進(jìn)行查詢,將查詢語句封裝為對象操作。優(yōu)點(diǎn):可讀性好,符合Java 程序員的編碼習(xí)慣。缺點(diǎn):不夠成熟,不支持投影(projection)或統(tǒng)計函數(shù)(aggregation)Hibernate語言查詢(Hibernate Query Language,HQL):它是完全面向?qū)ο蟮牟樵冋Z句,查詢功能非常強(qiáng)大,具備多態(tài)、關(guān)聯(lián)等特性 。Hibernate官方推薦使用HQL進(jìn)行查詢。Native SQL Queries(原生SQL查詢):直接使用標(biāo)準(zhǔn)SQL語言或跟特定數(shù)據(jù)庫相關(guān)
41、的SQL進(jìn)行查詢。例子:標(biāo)準(zhǔn)化對象查詢(Criteria Query)簡單例子:查詢用戶名以“J”開頭的所有用戶。Criteria criteria = session.createCriteria(User.class); criteria.add(Expression.like(name,J%); List users = criteria.list();Hibernate語言查詢(Hibernate Query Language,HQL)HQL用面向?qū)ο蟮姆绞缴蒘QL以類和屬性來代替表和數(shù)據(jù)列支持多態(tài)支持各種關(guān)聯(lián)減少了SQL的冗余HQL支持所有的關(guān)系數(shù)據(jù)庫操作連接(joins,包括In
42、ner/outer/full joins),笛卡爾積(cartesian products)投影(projection)聚合(Aggregation,max, avg)和分組(group)排序(Ordering)子查詢(Subqueries)SQL函數(shù)(SQL function calls)例子: Hibernate語言查詢(Hibernate Query Language,HQL)簡單例子:查詢用戶名以“J”開頭的所有用戶。Query query = session.createQuery(from User user where like J%); List users = query.l
43、ist();復(fù)雜例子:從User和Group中查找屬于“admin”組的所有用戶。Query query = session.createQuery(“from User user where =admin”);如果用傳統(tǒng)的SQL則查詢語句如下:select user.userId as userId, as name, user.groupId as groupId, user.idCardId as idCardId from TBL_USER user, TBL_GROUP group where (group.groupName=admin and user.groupId=group
44、.groupId)Hibernate性能優(yōu)化策略Hibernate高級話題:性能優(yōu)化策略的配置與使用本節(jié)包括如下主題:一級緩存二級緩存查詢緩存批量抓取批量更新一級緩存即session級別的緩存,隨著session的關(guān)閉而消失,load/iterator操作,會從一級緩存中查找數(shù)據(jù),如果找不到,再到數(shù)據(jù)庫里面查找。Query.list操作,如果沒有配置查詢緩存,將直接從數(shù)據(jù)庫中獲取數(shù)據(jù)。二級緩存(1)首先要打開二級緩存默認(rèn)情況下,二級緩存是打開的,可以通過配置:false來關(guān)閉二級緩存。使用:org.hibernate.cache.EhCacheProvider來指定緩存提供商。即有誰來提供緩存
45、的功能。Ehcache配置可以看例子,里面有非常清楚的說明。 二級緩存(2)要在映射文件中指定緩存策略在hbm文件中加入:cache usage=read-only/這個緩存策略的配置一定要加上,否則便不會有緩存的作用,Load/list/iterator等操作的結(jié)果將都不會緩存。注意,在hbm的class配置中添加配置,表示的是類緩存,如果把這個配置刪除,將只緩存ID,不緩存整個對象。(這個時候?qū)ist操作,也可能有n+1查詢問題)當(dāng)然,也可以選擇在標(biāo)簽里面嵌套定義這樣的標(biāo)簽:來代替直接將定義嵌套入標(biāo)簽的內(nèi)部。緩存策略緩存有幾種形式,可以在映射文件中配置:read-only(只讀,適用于很
46、少變更的靜態(tài)數(shù)據(jù)/歷史數(shù)據(jù)),nonstrict-read-write(不嚴(yán)格讀寫緩存,如果基本不會發(fā)生有兩個事務(wù)同時修改一個數(shù)據(jù)的時候,比read-write的性能要好),read-write(比較普遍的形式,效率一般),transactional(JTA中,且支持的緩存產(chǎn)品較少)二級緩存(3)Session如何與二級緩存交互?Session接口通過CacheMode來定制與二級緩存之間的交互方法查詢緩存默認(rèn)情況下關(guān)閉,需要打開。查詢緩存,對list/iterator這樣的操作會起作用??梢允褂茫簍rue來打開查詢緩存,默認(rèn)的情況下是關(guān)閉的。所謂查詢緩存,即讓hibernate緩存list、
47、iterator、createQuery等方法的查詢結(jié)果集。如果沒有打開查詢緩存,hibernate將只緩存load方法獲得的單個持久化對象。在打開了查詢緩存之后,需要注意,調(diào)用query.list()操作之前,必須顯式調(diào)用query.setCachable(true)來標(biāo)識某個查詢使用緩存。單端代理的批量抓取實(shí)例A引用實(shí)例B,B如果是代理的話(比如多對一關(guān)聯(lián)中):如果遍歷A的查詢結(jié)果集(假設(shè)有10條記錄),在遍歷A的時候,訪問B變量,將會導(dǎo)致n次查詢語句的發(fā)出!這個時候,如果在B一端的class上配置batch-size,Hibernate將會減少SQL語句的數(shù)量。Hibernate可以充分有效的使用批量抓取,也就是說,如果僅一個訪問代理(或集合),那么Hibernate將不載入其他未實(shí)例化的代理。 批量抓取是延遲查詢抓取的優(yōu)化方案,你可以在兩種批量抓取方案之間進(jìn)行選擇:在類級別和集合級別。 類/實(shí)體級別的批量抓
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/Z 17215.682-2024電測量數(shù)據(jù)交換DLMS/COSEM組件第82部分:社區(qū)網(wǎng)絡(luò)Mesh通信配置
- 水電建設(shè)招標(biāo)文件內(nèi)容
- 九年級歷史上冊 第二單元 近代社會的確立與動蕩 第9課 古老印度的抗?fàn)幗贪?北師大版
- 2024秋七年級語文上冊 第6單元 第21課 女媧造人教案 新人教版
- 2024-2025學(xué)年高中歷史 第五單元 經(jīng)濟(jì)全球化的趨勢 第27課 綜合探究:中國如何應(yīng)對全球化的挑戰(zhàn)(2)教學(xué)教案 岳麓版必修2
- 2024秋四年級英語上冊 Unit 1 The Clothes We Wear Lesson 1 Skirt and Trousers教案 冀教版(三起)
- 2023三年級語文上冊 第八單元 24 司馬光說課稿 新人教版
- 高考地理一輪復(fù)習(xí)第十八章資源安全與國家安全第二節(jié)耕地資源與糧食安全課件
- 消防泵房管理制度
- 自愿贈與的合同(2篇)
- 生鮮超市供貨超市供貨服務(wù)方案
- 體育器材登記臺賬
- 中小學(xué)數(shù)學(xué)教學(xué)有效銜接教育探索
- MOOC 現(xiàn)代郵政英語(English for Modern Postal Service)-南京郵電大學(xué) 中國大學(xué)慕課答案
- 高考一輪復(fù)習(xí)理數(shù)課件第三章第三節(jié)導(dǎo)數(shù)與函數(shù)的極值最值
- 胃結(jié)石的護(hù)理查房
- 中高考姓名代碼
- 年產(chǎn)3GWh鈉離子電池項目可行性研究報告模板-備案拿地
- 居民死亡醫(yī)學(xué)證明模板
- 河北開放大學(xué)2024年《金融市場》形考任務(wù)1-4答案
- 《Unit 10 You're supposed to shake hands》單元檢測題及答案
評論
0/150
提交評論