版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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ù)庫(kù)映射 集合類(lèi)映射和關(guān)聯(lián)映射 繼承映射 事務(wù)和并發(fā) HQL(Hibernate Query Language)查詢(xún)語(yǔ)句 條件查詢(xún)(Criteria) 緩存和性能,概述和特性,ORM(Object/Relational Mapping):對(duì)象、關(guān)系數(shù)據(jù)庫(kù)映射表示一種技術(shù),用來(lái)把對(duì)象模型表示的對(duì)象映射到基于SQL的關(guān)系模型數(shù)據(jù)結(jié)構(gòu)中去。 可以大幅度減少開(kāi)發(fā)人員使用SQL和JDBC處理數(shù)據(jù)的時(shí)間。 可以幫助你消除和包裝那些特定廠商的SQL代碼,并把結(jié)果集從表格的形式轉(zhuǎn)換到一系列的對(duì)象中去。例如: MySQL的分頁(yè)語(yǔ)句是: selec
2、t * from fm_alarm limit 0, 100; Oracle的分頁(yè)語(yǔ)句是: select * from ( select row_.*, rownum rownum_ from fm_alarm row_ where rownum 0 Hibernate分頁(yè): Query q = session.createQuery(“from Alarm alarm”); q.setFirstResult(0); q.setMaxResult(100);,支持對(duì)象化的查詢(xún)語(yǔ)句(HQL)和編程方式的(Criteria)查詢(xún) 支持緩存:一級(jí)緩存(Session級(jí)),二級(jí)緩存(SessionFa
3、ctory級(jí)) 支持并發(fā)控制:樂(lè)觀鎖定和悲觀鎖定 支持持久化對(duì)象之間的級(jí)聯(lián)操作,體系結(jié)構(gòu),SessionFactory:針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系編譯后的內(nèi)存鏡像,線程安全。是生成Session的工廠,可以用在進(jìn)程或集群的級(jí)別上,為事務(wù)之間可重用的數(shù)據(jù)提供二級(jí)緩存。 Session:應(yīng)用程序與持久層的一次交互。非線程安全。生命周期短暫。是持久化對(duì)象的一級(jí)緩存。 Transaction:應(yīng)用程序用來(lái)指定原子操作單元范圍對(duì)象。抽象應(yīng)用底層的JDBC、JTA、CORBA事務(wù)。,持久化對(duì)象和數(shù)據(jù)庫(kù)映射,持久化實(shí)例狀態(tài): 瞬態(tài)(Transient):實(shí)例從未與持久化上下文(Session)關(guān)聯(lián)過(guò),沒(méi)有持久化
4、標(biāo)識(shí)(主鍵ID) 持久(Persistent):實(shí)例目前與Session關(guān)聯(lián),擁有持久化標(biāo)識(shí)(主鍵ID),在數(shù)據(jù)庫(kù)中可能有對(duì)應(yīng)的一行記錄 脫管(Detached):實(shí)例曾經(jīng)與某個(gè)Session關(guān)聯(lián)過(guò),擁有持久化標(biāo)識(shí)(主鍵ID),目前不與Session關(guān)聯(lián),在數(shù)據(jù)庫(kù)中可能有對(duì)應(yīng)的一行記錄,在應(yīng)用程序中,用來(lái)實(shí)現(xiàn)業(yè)務(wù)問(wèn)題實(shí)體的類(lèi)就是持久化類(lèi) 持久化類(lèi)舉例:,每個(gè)持久化類(lèi)要實(shí)現(xiàn)一個(gè)空參數(shù)的構(gòu)造方法(可以不是public的),Hibernate用Constructor.newInstance()來(lái)實(shí)例化它們 每個(gè)持久化類(lèi)都要提供一個(gè)標(biāo)識(shí)屬性,這個(gè)屬性對(duì)應(yīng)數(shù)據(jù)庫(kù)的主鍵字段,類(lèi)型可以是java的基本類(lèi)型或
5、者是包裝類(lèi)型,如:,java.lang.String 代理是Hibernate的重要功能,要求持久化類(lèi)不為final 若要把持久化對(duì)象放入Set集合中,為了標(biāo)識(shí)對(duì)象,需要實(shí)現(xiàn)equals()和hashcode()方法,對(duì)象和關(guān)系數(shù)據(jù)庫(kù)之間的映射用一個(gè)XML文件表示:,Hibernate的主配置參數(shù),多數(shù)通過(guò)hibernate.cfg.xml配置 通過(guò)perties配置文件配置 通過(guò)編程的方式實(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();,集合類(lèi)映射和關(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)來(lái)實(shí)現(xiàn)集合接口,用來(lái)實(shí)現(xiàn)LazyLoad機(jī)制 用于映射集合類(lèi)的hibernate映射元素取決于接口的類(lèi)型,總共有:, 以map映射的集合為例:, ,(1)name 集合屬性的名稱(chēng) (2)table (可選默認(rèn)為屬性的名稱(chēng))這個(gè)集合表的名稱(chēng)(不能在一對(duì)多的關(guān)聯(lián)關(guān)系中使用) (3)schema (可選) 表的schema的名稱(chēng), 他將覆蓋在根元素中定義的schema (4)lazy (可選-默認(rèn)為true) 可以用來(lái)關(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è)用來(lái)比較的類(lèi)。 (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) 用于在外連接抓取、通過(guò)后續(xù)select抓取和通過(guò)后續(xù)subselect抓取之間選擇。
9、 (11)batch-size (可選, 默認(rèn)為1) 指定通過(guò)延遲加載取得集合實(shí)例的批處理塊大?。ā癰atch size”)。 (12)access(可選-默認(rèn)為屬性property):Hibernate取得屬性值時(shí)使用的策略 (13)樂(lè)觀鎖 (可選 - 默認(rèn)為 true): 對(duì)集合的狀態(tài)的改變會(huì)是否導(dǎo)致其所屬的實(shí)體的版本增長(zhǎng)。 (對(duì)一對(duì)多關(guān)聯(lián)來(lái)說(shuō),關(guān)閉這個(gè)屬性常常是有理的),索引集合類(lèi) 除了set和bag語(yǔ)義外,都需要一個(gè)索引字段來(lái)保存對(duì)應(yīng)集合的索引 (1)column(可選):保存集合索引值的字段名。 (2)formula (可選): 用于計(jì)算map關(guān)鍵字的SQL公式 (3)type (可
10、選,默認(rèn)為整型integer):集合索引的類(lèi)型。,值集合于多對(duì)多關(guān)聯(lián) 用element元素把基本類(lèi)型的集合映射成一張關(guān)系表 ,關(guān)聯(lián)映射的種類(lèi) 可以分為單向關(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)是通過(guò)在兩張數(shù)據(jù)庫(kù)表間建立主外鍵關(guān)系 many-to-many的關(guān)聯(lián)是通過(guò)一張關(guān)系表來(lái)保存兩者之間關(guān)系的,繼承映射,Hibernate支持三種基本的繼承映射策略: 每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy) 每個(gè)子類(lèi)一張表(
11、table per subclass) 每個(gè)具體類(lèi)一張表(table per concrete class),每個(gè)類(lèi)分層結(jié)構(gòu)一張表(table per class hierarchy) 所有的父類(lèi)和子類(lèi)的字段存在一張表中,通過(guò)一個(gè)discriminator 字段標(biāo)識(shí)類(lèi)名,限制是不允許有not null的屬性存在,每個(gè)子類(lèi)一張表(table per subclass) 表的數(shù)量為父類(lèi)和子類(lèi)個(gè)數(shù)之和.三個(gè)子類(lèi)表通過(guò)主鍵關(guān)聯(lián)到超類(lèi)表(因而關(guān)系模型實(shí)際上是一對(duì)一關(guān)聯(lián))。,每個(gè)具體類(lèi)一張表(table per concrete class) 所有子類(lèi)各一張表.每張表為對(duì)應(yīng)類(lèi)的所有屬性(包括從超類(lèi)繼承的屬
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)過(guò)Hibernate的處理,成為一個(gè)PO /而anotherUser仍
13、然是個(gè)VO mit(); /事務(wù)提交之后,庫(kù)表中已經(jīng)插入一條用戶(hù)”Emma”的記錄 /對(duì)于anotherUser則無(wú)任何操作 Transaction tx = session.beginTransaction(); user.setName(Emma_1); /PO anotherUser.setName(Kevin_1);/VO mit(); /事務(wù)提交之后,PO的狀態(tài)被固化到數(shù)據(jù)庫(kù)中 /也就是說(shuō)數(shù)據(jù)庫(kù)中“Emma”的用戶(hù)記錄已經(jīng)被更新為“Emma_1” /此時(shí)anotherUser仍然是個(gè)普通Java對(duì)象,它的屬性更改不會(huì) /對(duì)數(shù)據(jù)庫(kù)產(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ù)庫(kù)的事務(wù)應(yīng)該盡可能的短.可以降低數(shù)據(jù)庫(kù)鎖定造成的資源爭(zhēng)用.數(shù)據(jù)庫(kù)長(zhǎng)的事務(wù)會(huì)導(dǎo)致應(yīng)用程序無(wú)法擴(kuò)展到高的并發(fā)負(fù)載.,session-per-operation 不要因?yàn)橐淮魏?jiǎn)單的數(shù)據(jù)庫(kù)調(diào)用,就打開(kāi)和關(guān)閉一次Session!數(shù)據(jù)庫(kù)事務(wù)也是如此 session-per-request 在這種模式下,來(lái)自客戶(hù)端的請(qǐng)求被發(fā)送到服務(wù)器端(即Hibernate持久化層運(yùn)行的地方),一
16、 個(gè)新的Hibernate Session被打開(kāi),并且執(zhí)行這個(gè)操作單元中所有的數(shù)據(jù)庫(kù)操作 長(zhǎng)時(shí)間的操作帶來(lái)的并發(fā)問(wèn)題.用戶(hù)在界面修改任務(wù)屬性,過(guò)了5分鐘才點(diǎn)確定,這段時(shí)間內(nèi)如果別的用戶(hù)也修改了這個(gè)任務(wù),那么前者的修改就會(huì)被后者覆蓋掉.,樂(lè)觀并發(fā)控制(Optimistic concurrency control) 類(lèi)似于CVS的實(shí)現(xiàn)方式,為每個(gè)對(duì)象和其對(duì)應(yīng)的數(shù)據(jù)庫(kù)表加入版本控制字段或時(shí)間戳.每次修改后都會(huì)修改版本控制字段自動(dòng)增加.如果出現(xiàn)沖突,會(huì)主動(dòng)拋出異常,提示后修改者已經(jīng)有其他用戶(hù)修改了該數(shù)據(jù).有Hibernate程序來(lái)控制. 悲觀鎖定(Pessimistic Locking) 用戶(hù)其實(shí)并不
17、需要花很多精力去擔(dān)心鎖定策略的問(wèn)題,它利用了數(shù)據(jù)庫(kù)實(shí)現(xiàn)的鎖策略.,HQL(Hibernate Query Language)查詢(xún)語(yǔ)句,HQL被設(shè)計(jì)為類(lèi)似SQL的面向?qū)ο蟮牟樵?xún)語(yǔ)句.支持繼承,多態(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è)類(lèi)要有相應(yīng)的構(gòu)造方法),支持聚集函數(shù)如:s
19、um() ,avg(), count(), min(), max() 支持多態(tài)查詢(xún): from AlarmRule entity where entity.id=5 (如果id是5的記錄對(duì)應(yīng)的類(lèi)是AlarmRule的子類(lèi),則實(shí)際返回子類(lèi)的實(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類(lèi)型的名字,以及extract(. from .),只要ANSI cast() 和 extract() 被底層數(shù)據(jù)庫(kù)支持 任何數(shù)據(jù)庫(kù)支持的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 類(lèi)型的常量 eg.Color.TABB
22、Y 也支持order by子句 ,group by子句和子查詢(xún),條件查詢(xún)(Criteria),org.hibernate.Criteria接口表示特定持久類(lèi)的一個(gè)查詢(xún) 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 蒸煮酒精工廠課程設(shè)計(jì)
- 課課程設(shè)計(jì)濾波器設(shè)計(jì)
- 礦供電課程設(shè)計(jì)
- 錐齒輪機(jī)械課程設(shè)計(jì)
- 高中地理土壤課程設(shè)計(jì)
- 飲品全系列課程設(shè)計(jì)
- 限流引流課程設(shè)計(jì)
- 項(xiàng)目管理課程設(shè)計(jì)論文
- 音樂(lè)盒電路課程設(shè)計(jì)
- 物料輸送裝置課程設(shè)計(jì)
- 人教精通版5年級(jí)(上下冊(cè))單詞表(含音標(biāo))
- 五年級(jí)語(yǔ)文下冊(cè)全冊(cè)教材分析
- 第1課+中華文明的起源與早期國(guó)家+課件+-2023-2024學(xué)年高中歷史統(tǒng)編版2019必修中外歷史綱要上冊(cè)+
- 大廈物業(yè)管理保潔服務(wù)標(biāo)準(zhǔn)5篇
- 神經(jīng)內(nèi)科國(guó)家臨床重點(diǎn)專(zhuān)科建設(shè)項(xiàng)目評(píng)分標(biāo)準(zhǔn)(試行)
- 城市設(shè)計(jì)與城市更新培訓(xùn)
- 2023年貴州省銅仁市中考數(shù)學(xué)真題試題含解析
- 世界衛(wèi)生組織生存質(zhì)量測(cè)量表(WHOQOL-BREF)
- 某送電線路安全健康環(huán)境與文明施工監(jiān)理細(xì)則
- GB/T 28885-2012燃?xì)夥?wù)導(dǎo)則
- PEP-3心理教育量表-評(píng)估報(bào)告
評(píng)論
0/150
提交評(píng)論