hibernate基礎(chǔ).ppt_第1頁
hibernate基礎(chǔ).ppt_第2頁
hibernate基礎(chǔ).ppt_第3頁
hibernate基礎(chǔ).ppt_第4頁
hibernate基礎(chǔ).ppt_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Hibernate介紹,內(nèi)容,概述和特性 體系結(jié)構(gòu) 持久化對(duì)象和數(shù)據(jù)庫映射 集合類映射和關(guān)聯(lián)映射 繼承映射 事務(wù)和并發(fā) HQL(Hibernate Query Language)查詢語句 條件查詢(Criteria) 緩存和性能,概述和特性,ORM(Object/Relational Mapping):對(duì)象、關(guān)系數(shù)據(jù)庫映射表示一種技術(shù),用來把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中去。 可以大幅度減少開發(fā)人員使用SQL和JDBC處理數(shù)據(jù)的時(shí)間。 可以幫助你消除和包裝那些特定廠商的SQL代碼,并把結(jié)果集從表格的形式轉(zhuǎn)換到一系列的對(duì)象中去。例如: MySQL的分頁語句是: selec

2、t * from fm_alarm limit 0, 100; Oracle的分頁語句是: select * from ( select row_.*, rownum rownum_ from fm_alarm row_ where rownum 0 Hibernate分頁: Query q = session.createQuery(“from Alarm alarm”); q.setFirstResult(0); q.setMaxResult(100);,支持對(duì)象化的查詢語句(HQL)和編程方式的(Criteria)查詢 支持緩存:一級(jí)緩存(Session級(jí)),二級(jí)緩存(SessionFa

3、ctory級(jí)) 支持并發(fā)控制:樂觀鎖定和悲觀鎖定 支持持久化對(duì)象之間的級(jí)聯(lián)操作,體系結(jié)構(gòu),SessionFactory:針對(duì)單個(gè)數(shù)據(jù)庫映射關(guān)系編譯后的內(nèi)存鏡像,線程安全。是生成Session的工廠,可以用在進(jìn)程或集群的級(jí)別上,為事務(wù)之間可重用的數(shù)據(jù)提供二級(jí)緩存。 Session:應(yīng)用程序與持久層的一次交互。非線程安全。生命周期短暫。是持久化對(duì)象的一級(jí)緩存。 Transaction:應(yīng)用程序用來指定原子操作單元范圍對(duì)象。抽象應(yīng)用底層的JDBC、JTA、CORBA事務(wù)。,持久化對(duì)象和數(shù)據(jù)庫映射,持久化實(shí)例狀態(tài): 瞬態(tài)(Transient):實(shí)例從未與持久化上下文(Session)關(guān)聯(lián)過,沒有持久化

4、標(biāo)識(shí)(主鍵ID) 持久(Persistent):實(shí)例目前與Session關(guān)聯(lián),擁有持久化標(biāo)識(shí)(主鍵ID),在數(shù)據(jù)庫中可能有對(duì)應(yīng)的一行記錄 脫管(Detached):實(shí)例曾經(jīng)與某個(gè)Session關(guān)聯(lián)過,擁有持久化標(biāo)識(shí)(主鍵ID),目前不與Session關(guān)聯(lián),在數(shù)據(jù)庫中可能有對(duì)應(yīng)的一行記錄,在應(yīng)用程序中,用來實(shí)現(xiàn)業(yè)務(wù)問題實(shí)體的類就是持久化類 持久化類舉例:,每個(gè)持久化類要實(shí)現(xiàn)一個(gè)空參數(shù)的構(gòu)造方法(可以不是public的),Hibernate用Constructor.newInstance()來實(shí)例化它們 每個(gè)持久化類都要提供一個(gè)標(biāo)識(shí)屬性,這個(gè)屬性對(duì)應(yīng)數(shù)據(jù)庫的主鍵字段,類型可以是java的基本類型或

5、者是包裝類型,如:,java.lang.String 代理是Hibernate的重要功能,要求持久化類不為final 若要把持久化對(duì)象放入Set集合中,為了標(biāo)識(shí)對(duì)象,需要實(shí)現(xiàn)equals()和hashcode()方法,對(duì)象和關(guān)系數(shù)據(jù)庫之間的映射用一個(gè)XML文件表示:,Hibernate的主配置參數(shù),多數(shù)通過hibernate.cfg.xml配置 通過perties配置文件配置 通過編程的方式實(shí)現(xiàn)配置: Configuration cfg = new Configuration() cfg. addResource(“pm-meas-job.hbm.xml”); cfg

6、.addClass(MeasJob.class); cfg.setProperty(“hibernate.dialect”, “org.hibernate.dialect.Oracle9iDialect”); SessionFactory sf = cfg.buildSessionFactory();,集合類映射和關(guān)聯(lián)映射,Hibernate要求持久化集合字段用接口聲明,比如:java.util.Set, java.util.List, java.util.Map , java.util.sortedSet, java.util.sortedMap Hibernate在管理持久化對(duì)象時(shí),會(huì)用自

7、己的實(shí)現(xiàn)來實(shí)現(xiàn)集合接口,用來實(shí)現(xiàn)LazyLoad機(jī)制 用于映射集合類的hibernate映射元素取決于接口的類型,總共有:, 以map映射的集合為例:, ,(1)name 集合屬性的名稱 (2)table (可選默認(rèn)為屬性的名稱)這個(gè)集合表的名稱(不能在一對(duì)多的關(guān)聯(lián)關(guān)系中使用) (3)schema (可選) 表的schema的名稱, 他將覆蓋在根元素中定義的schema (4)lazy (可選-默認(rèn)為true) 可以用來關(guān)閉延遲加載,指定一直使用預(yù)先抓?。▽?duì)數(shù)組不適用) (5)inverse (可選默認(rèn)為false) 標(biāo)記這個(gè)集合作為雙向關(guān)聯(lián)關(guān)系中的方向一端。 (6)cascade (可選默認(rèn)

8、為none) 讓操作級(jí)聯(lián)到子實(shí)體 (7)sort(可選)指定集合的排序順序, 其可以為自然的(natural)或者給定一個(gè)用來比較的類。 (8)order-by (可選, 僅用于jdk1.4) 指定表的字段(一個(gè)或幾個(gè))再加上asc或者desc(可選), 定義Map,Set和Bag的迭代順序 (9)where (可選) 指定任意的SQL where條件, 該條件將在重新載入或者刪除這個(gè)集合時(shí)使用(當(dāng)集合中的數(shù)據(jù)僅僅是所有可用數(shù)據(jù)的一個(gè)子集時(shí)這個(gè)條件非常有用) (10)fetch (可選, 默認(rèn)為select) 用于在外連接抓取、通過后續(xù)select抓取和通過后續(xù)subselect抓取之間選擇。

9、 (11)batch-size (可選, 默認(rèn)為1) 指定通過延遲加載取得集合實(shí)例的批處理塊大?。ā癰atch size”)。 (12)access(可選-默認(rèn)為屬性property):Hibernate取得屬性值時(shí)使用的策略 (13)樂觀鎖 (可選 - 默認(rèn)為 true): 對(duì)集合的狀態(tài)的改變會(huì)是否導(dǎo)致其所屬的實(shí)體的版本增長。 (對(duì)一對(duì)多關(guān)聯(lián)來說,關(guān)閉這個(gè)屬性常常是有理的),索引集合類 除了set和bag語義外,都需要一個(gè)索引字段來保存對(duì)應(yīng)集合的索引 (1)column(可選):保存集合索引值的字段名。 (2)formula (可選): 用于計(jì)算map關(guān)鍵字的SQL公式 (3)type (可

10、選,默認(rèn)為整型integer):集合索引的類型。,值集合于多對(duì)多關(guān)聯(lián) 用element元素把基本類型的集合映射成一張關(guān)系表 ,關(guān)聯(lián)映射的種類 可以分為單向關(guān)聯(lián)和雙向關(guān)聯(lián) 也可以分為ont-to-one, one-to-many, many-to-many三種關(guān)聯(lián) ont-to-one的關(guān)聯(lián)有唯一外鍵關(guān)聯(lián)和主鍵關(guān)聯(lián) one-to-many的關(guān)聯(lián)是通過在兩張數(shù)據(jù)庫表間建立主外鍵關(guān)系 many-to-many的關(guān)聯(lián)是通過一張關(guān)系表來保存兩者之間關(guān)系的,繼承映射,Hibernate支持三種基本的繼承映射策略: 每個(gè)類分層結(jié)構(gòu)一張表(table per class hierarchy) 每個(gè)子類一張表(

11、table per subclass) 每個(gè)具體類一張表(table per concrete class),每個(gè)類分層結(jié)構(gòu)一張表(table per class hierarchy) 所有的父類和子類的字段存在一張表中,通過一個(gè)discriminator 字段標(biāo)識(shí)類名,限制是不允許有not null的屬性存在,每個(gè)子類一張表(table per subclass) 表的數(shù)量為父類和子類個(gè)數(shù)之和.三個(gè)子類表通過主鍵關(guān)聯(lián)到超類表(因而關(guān)系模型實(shí)際上是一對(duì)一關(guān)聯(lián))。,每個(gè)具體類一張表(table per concrete class) 所有子類各一張表.每張表為對(duì)應(yīng)類的所有屬性(包括從超類繼承的屬

12、性)定義相應(yīng)字段。,事務(wù)和并發(fā),PO 即 Persistence Object VO 即 Value Object,TUser user = new TUser(); TUser anotherUser = new TUser(); user.setName(Emma); anotherUser.setName(Kevin); /此時(shí)user和anotherUser都是VO Transaction tx = session.beginTransaction(); session.save(user); /此時(shí)的user已經(jīng)經(jīng)過Hibernate的處理,成為一個(gè)PO /而anotherUser仍

13、然是個(gè)VO mit(); /事務(wù)提交之后,庫表中已經(jīng)插入一條用戶”Emma”的記錄 /對(duì)于anotherUser則無任何操作 Transaction tx = session.beginTransaction(); user.setName(Emma_1); /PO anotherUser.setName(Kevin_1);/VO mit(); /事務(wù)提交之后,PO的狀態(tài)被固化到數(shù)據(jù)庫中 /也就是說數(shù)據(jù)庫中“Emma”的用戶記錄已經(jīng)被更新為“Emma_1” /此時(shí)anotherUser仍然是個(gè)普通Java對(duì)象,它的屬性更改不會(huì) /對(duì)數(shù)據(jù)庫產(chǎn)生任何影響 /由Hibernate返回的PO TUse

14、r user = (TUser)session.load(TUser.class,new Integer(1);,org.hibernate.Session和org.hibernate.Query的查用方法: Session.save() Session.update() Session.delete() Query query = session.createQuery(“select Alarm alarm where alarm.id=?”).setLong(0, 1L); query.list(); query.uniqueResult();,SessionFactory的創(chuàng)建代價(jià)很昂

15、貴,它線程安全,可以設(shè)計(jì)成被所有的應(yīng)用程序線程共享.它只創(chuàng)建一次,通常是由應(yīng)用程序啟動(dòng)的時(shí)候,由Configuration對(duì)象創(chuàng)建. Session對(duì)象是輕型的,非線程安全的,對(duì)單個(gè)工作單元而言,它只被使用一次,然后就丟棄. 數(shù)據(jù)庫的事務(wù)應(yīng)該盡可能的短.可以降低數(shù)據(jù)庫鎖定造成的資源爭(zhēng)用.數(shù)據(jù)庫長的事務(wù)會(huì)導(dǎo)致應(yīng)用程序無法擴(kuò)展到高的并發(fā)負(fù)載.,session-per-operation 不要因?yàn)橐淮魏?jiǎn)單的數(shù)據(jù)庫調(diào)用,就打開和關(guān)閉一次Session!數(shù)據(jù)庫事務(wù)也是如此 session-per-request 在這種模式下,來自客戶端的請(qǐng)求被發(fā)送到服務(wù)器端(即Hibernate持久化層運(yùn)行的地方),一

16、 個(gè)新的Hibernate Session被打開,并且執(zhí)行這個(gè)操作單元中所有的數(shù)據(jù)庫操作 長時(shí)間的操作帶來的并發(fā)問題.用戶在界面修改任務(wù)屬性,過了5分鐘才點(diǎn)確定,這段時(shí)間內(nèi)如果別的用戶也修改了這個(gè)任務(wù),那么前者的修改就會(huì)被后者覆蓋掉.,樂觀并發(fā)控制(Optimistic concurrency control) 類似于CVS的實(shí)現(xiàn)方式,為每個(gè)對(duì)象和其對(duì)應(yīng)的數(shù)據(jù)庫表加入版本控制字段或時(shí)間戳.每次修改后都會(huì)修改版本控制字段自動(dòng)增加.如果出現(xiàn)沖突,會(huì)主動(dòng)拋出異常,提示后修改者已經(jīng)有其他用戶修改了該數(shù)據(jù).有Hibernate程序來控制. 悲觀鎖定(Pessimistic Locking) 用戶其實(shí)并不

17、需要花很多精力去擔(dān)心鎖定策略的問題,它利用了數(shù)據(jù)庫實(shí)現(xiàn)的鎖策略.,HQL(Hibernate Query Language)查詢語句,HQL被設(shè)計(jì)為類似SQL的面向?qū)ο蟮牟樵冋Z句.支持繼承,多態(tài). From子句: from MeasJob entity 返回MeasJob對(duì)應(yīng)表的所有記錄 關(guān)聯(lián)(Association)與連接(Join) : select entity from MeasJob entity join entity.neMOMap nemo where nemo.id=5 Select子句 Select * from MeasJob entity 返回List Select e

18、ntity.stopTime, entity.startTime from MeasJob entity 返回List Select entity.jobName from MeasJob entity 返回String Select new list(entity.stopTime, entity.startTime) from MeasJob entity 返回List Select new JobTime(entity.stopTime, entity.startTime) from MeasJob entity 返回List(JobTime這個(gè)類要有相應(yīng)的構(gòu)造方法),支持聚集函數(shù)如:s

19、um() ,avg(), count(), min(), max() 支持多態(tài)查詢: from AlarmRule entity where entity.id=5 (如果id是5的記錄對(duì)應(yīng)的類是AlarmRule的子類,則實(shí)際返回子類的實(shí)例) Where子句: 數(shù)學(xué)運(yùn)算符+, -, *, / 二進(jìn)制比較運(yùn)算符=, =, , !=, like 邏輯運(yùn)算符and, or, not ,in, not in, between, is null, is not null, is empty, is not empty, member of and not member of 簡(jiǎn)單的 case, cas

20、e . when . then . else . end,和 搜索 case, case when . then . else . end 字符串連接符.|. or concat(.,.) current_date(), current_time(), current_timestamp() second(.), minute(.), hour(.), day(.), month(.), year(.), EJB-QL 3.0定義的任何函數(shù)或操作:substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(),

21、bit_length() coalesce() 和 nullif() cast(. as .), 其第二個(gè)參數(shù)是某Hibernate類型的名字,以及extract(. from .),只要ANSI cast() 和 extract() 被底層數(shù)據(jù)庫支持 任何數(shù)據(jù)庫支持的SQL標(biāo)量函數(shù),比如sign(), trunc(), rtrim(), sin() JDBC參數(shù)傳入 ? 命名參數(shù):name, :start_date, :x1 SQL 直接常量 foo, 69, 1970-01-01 10:00:01.0 Java public static final 類型的常量 eg.Color.TABB

22、Y 也支持order by子句 ,group by子句和子查詢,條件查詢(Criteria),org.hibernate.Criteria接口表示特定持久類的一個(gè)查詢 List cats = session.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.between(weight, minWeight, maxWeight) ) .list(); 等同于select * from Cat cat where like Fritz% and cat.weight between minWeight and maxWeight List cats = session.createCriteria(Cat.class) .add( Restrictions.in( name, new String Fritz,Izi,Pk ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull(age) ) .add( Restrictions.eq(age, new Integer(0) )

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論