對象關(guān)系映射ppt課件_第1頁
對象關(guān)系映射ppt課件_第2頁
對象關(guān)系映射ppt課件_第3頁
對象關(guān)系映射ppt課件_第4頁
對象關(guān)系映射ppt課件_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、對象對象/關(guān)系映射關(guān)系映射Hibernate 錢安川 Moxie :achqianyahoo q學(xué)員要求:熟習(xí)學(xué)員要求:熟習(xí)Java、SQL、JDBC,掌握面向?qū)ο螅莆彰嫦驅(qū)ο蟮拈_發(fā)方法,并有實踐工程開發(fā)閱歷的開發(fā)方法,并有實踐工程開發(fā)閱歷q課程目的:了解課程目的:了解O/R Mapping原理,掌握原理,掌握Hibernate開開發(fā)的相關(guān)知識,并能運用發(fā)的相關(guān)知識,并能運用Hibernate進(jìn)展實踐工程開發(fā)進(jìn)展實踐工程開發(fā)目錄目錄一、耐久化層O/R Mapping二、Hibernate入門三、Hibernate映射聲明Mapping declaration四、耐久化對象的形狀和生命周期五、

2、Hibernate查詢六、Hibernate最正確實際一、耐久化層一、耐久化層O/R Mapping基于B/S的典型三層架構(gòu)如何分層?如何分層?業(yè)務(wù)邏輯層和耐久化層業(yè)務(wù)邏輯層和耐久化層絕不要依賴于展現(xiàn)層。絕不要依賴于展現(xiàn)層。運用假設(shè)法測試。運用假設(shè)法測試。例子:例子:1、一個顯示課程、一個顯示課程考試分?jǐn)?shù)的列表。如今考試分?jǐn)?shù)的列表。如今要將不及格的分?jǐn)?shù)用紅要將不及格的分?jǐn)?shù)用紅色字體顯示低于色字體顯示低于60分。分。2、搜索。、搜索。如何進(jìn)展對象關(guān)系數(shù)據(jù)庫的匹配如何進(jìn)展對象關(guān)系數(shù)據(jù)庫的匹配public class User private String name; private String

3、password;private List address;create table tbl_user name varchar255 not null , password varchar255,.primary key name 如何進(jìn)展對象關(guān)系數(shù)據(jù)庫的匹配?如何進(jìn)展對象關(guān)系數(shù)據(jù)庫的匹配?對象對象關(guān)系數(shù)據(jù)庫關(guān)系數(shù)據(jù)庫類的屬性根本類型表的列類表1:n/n:1外鍵n:m關(guān)聯(lián)表繼承單表繼承、詳細(xì)表繼承、類表繼承對象對象關(guān)系數(shù)據(jù)庫的不匹配范式關(guān)系數(shù)據(jù)庫的不匹配范式q 粒度granularity的問題q 子類型subtypes的問題q 同一性identity的問題q 與關(guān)聯(lián)associations有

4、關(guān)的問題q 對象構(gòu)造導(dǎo)航navigation的問題q 范式不匹配的代價q 破費很多時間和精神來手工實現(xiàn)對象和關(guān)系的匹配。q 甚至要扭曲對象模型直到它與下層的關(guān)系技術(shù)匹配為止。q JDBC API本身的問題。JDBC和SQL提供了一個面向語句即命令的方法從SQL數(shù)據(jù)庫中來回挪動數(shù)據(jù)。至少在三個時辰Insert,Update,Select必需指定一個構(gòu)造化關(guān)系,這添加了設(shè)計和實現(xiàn)所需求的時間。 基于關(guān)系數(shù)據(jù)庫的耐久層可選方案基于關(guān)系數(shù)據(jù)庫的耐久層可選方案優(yōu)點優(yōu)點缺點缺點SQL/JDBC成熟,流行,使用DAO形式代碼煩雜,可讀性差,維護(hù)困難,移植困難Entity BeanCMPEJB1.1之后,將來

5、的EJB3錯誤的設(shè)計。不可移植,依賴性強(qiáng),不可序列化,不支持多態(tài)的關(guān)聯(lián)查詢JDO簡單、透明、規(guī)范不夠成熟基于關(guān)系數(shù)據(jù)庫的耐久層可選方案基于關(guān)系數(shù)據(jù)庫的耐久層可選方案優(yōu)點優(yōu)點缺點缺點Apache OJB性能、穩(wěn)定性,屬于Apache 基金組織文檔資源太少,支持規(guī)范太多成了負(fù)擔(dān)ODMG 3.0,JDO1.0iBATIS可以控制更多的數(shù)據(jù)庫操作細(xì)節(jié)。實用于遺留系統(tǒng)的改造和對既有數(shù)據(jù)庫的復(fù)用。耐久層封裝不夠徹底,只是一個DBHelper。Hibernate成熟、流行、功能強(qiáng)大。并逐步開展成Java 耐久層事實上的規(guī)范。不夠透明O/R Mapping -What? Why? 什么是什么是O/R Mapp

6、ing? 對象對象-關(guān)系映射是一門非常適用的工程技術(shù),它實現(xiàn)關(guān)系映射是一門非常適用的工程技術(shù),它實現(xiàn)了了Java運用中的對象到關(guān)系數(shù)據(jù)庫中的表的自動的運用中的對象到關(guān)系數(shù)據(jù)庫中的表的自動的和透明的耐久化,運用元數(shù)據(jù)和透明的耐久化,運用元數(shù)據(jù)meta data描描畫對象與數(shù)據(jù)庫間的映射。畫對象與數(shù)據(jù)庫間的映射。 O/R Mapping的優(yōu)點的優(yōu)點 提高消費率提高消費率Productivity 可維護(hù)性可維護(hù)性Maintainability 更好性能更好性能Performance 廠商獨立性廠商獨立性Vendor independence二、二、Hibernate入門入門 Hibernate概述概

7、述 Hibernate是非常優(yōu)秀、成熟的是非常優(yōu)秀、成熟的O/R Mapping框架。框架。它提供了強(qiáng)大的對象和關(guān)系數(shù)據(jù)庫映射以及查詢功能。它提供了強(qiáng)大的對象和關(guān)系數(shù)據(jù)庫映射以及查詢功能。 Hibernate優(yōu)勢優(yōu)勢 開源開源LGPL 成熟成熟 流行約流行約13 000 downloads/month 自定義自定義API JBoss 將用將用Hibernate3實現(xiàn)實現(xiàn)Entity BeansHibernate開發(fā)步驟開發(fā)步驟一、耐久化類的設(shè)計一、耐久化類的設(shè)計二、耐久化類和關(guān)系數(shù)據(jù)庫二、耐久化類和關(guān)系數(shù)據(jù)庫的映射的映射三、運用的開發(fā)三、運用的開發(fā)耐久化耐久化Java類必需遵照的原那么類必需遵

8、照的原那么q 為類的耐久化類字段聲明訪問方法get/set。Hibernate對JavaBeans風(fēng)格的屬性實行耐久化。q 實現(xiàn)一個默許的構(gòu)造方法constructor。這樣的話Hibernate就可以運用Constructor.newInstance來實例化它們。q 假設(shè)是集合類型的屬性,它的類型必需定義為集合的接口。例如:List、Set。q 提供一個標(biāo)識屬性identifier property。假設(shè)沒有該屬性,一些功能不起作用,比如:級聯(lián)更新Cascaded updatesSession.saveOrUpdate。耐久化類和關(guān)系數(shù)據(jù)庫的映射耐久化類和關(guān)系數(shù)據(jù)庫的映射XDoclet:它經(jīng)

9、過在:它經(jīng)過在Java源代碼中參與特定的源代碼中參與特定的JavaDoc tag,從而為其添加特定的附加語義,從而為其添加特定的附加語義,之后經(jīng)過之后經(jīng)過XDoclet工具對代碼中工具對代碼中JavaDoc Tag進(jìn)展分析,自動生成與代碼對應(yīng)的配置文件進(jìn)展分析,自動生成與代碼對應(yīng)的配置文件 從數(shù)據(jù)庫中已從數(shù)據(jù)庫中已有有的表構(gòu)造中生成的表構(gòu)造中生成Hibernate映射文映射文件。當(dāng)前版本是件。當(dāng)前版本是2.1可以去可以去 boss.bekk.no/boss/middlegen下載。下載。Hibernate中心接口中心接口Configuration 概述:概述:Configuration 類擔(dān)任

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

11、用代碼:調(diào)用代碼:Configuration cfg = new Configuration.configure;Configuration例子 數(shù)據(jù)庫銜接的配置數(shù)據(jù)庫銜接的配置 hibernate.dialect net.sf.hibernate.dialect.MySQLDialect hibernate.connection.driver_class com.mysql.jdbc.Driver hibernate.connection.url jdbc:mysql localhost/hibernate hibernate.connection.username root hiberna

12、te.connection.password 數(shù)據(jù)庫銜接池的配置數(shù)據(jù)庫銜接池的配置DBCPApp Server銜接池首選銜接池首選 vider_class net.sf.hibernate.connection.DBCPConnectionProvider 配置配置DBCP銜接池銜接池 其它其它 hibernate.show_sql true hibernate.jdbc.fetch_size 50 hibernate.jdbc.batch_size 25SessionFactory 概述:運用程序從概述:運用程序從SessionFactory會

13、話工廠里獲得會話工廠里獲得Session會會話實例。它在多個運用線程間進(jìn)展共享。通常情況下,整個運用話實例。它在多個運用線程間進(jìn)展共享。通常情況下,整個運用只需獨一的一個會話工廠只需獨一的一個會話工廠例如在運用初始化時被創(chuàng)建。然而,例如在運用初始化時被創(chuàng)建。然而,假設(shè)他運用假設(shè)他運用Hibernate訪問多個數(shù)據(jù)庫,他需求對每一個數(shù)據(jù)庫運訪問多個數(shù)據(jù)庫,他需求對每一個數(shù)據(jù)庫運用一個會話工廠。用一個會話工廠。 會話工廠緩存了生成的會話工廠緩存了生成的SQL語句和語句和Hibernate在運轉(zhuǎn)時運用的映在運轉(zhuǎn)時運用的映射元數(shù)據(jù)。射元數(shù)據(jù)。 調(diào)用代碼:調(diào)用代碼: SessionFactory ses

14、sionFactory = cfg.buildSessionFactory;Session會話會話 概述:概述: Session不是線程平安的,它代表與數(shù)據(jù)庫之間的一次操不是線程平安的,它代表與數(shù)據(jù)庫之間的一次操作,它的概念介于作,它的概念介于Connection和和Transaction之間。之間。 Session也稱為耐久化管理器,由于它是與耐久化有關(guān)也稱為耐久化管理器,由于它是與耐久化有關(guān)的操作接口。的操作接口。 Session經(jīng)過經(jīng)過SessionFactory翻開,在一切的任務(wù)完成后,翻開,在一切的任務(wù)完成后,需求封鎖。需求封鎖。 它與它與Web層的層的 Session沒有任何關(guān)系。

15、沒有任何關(guān)系。 調(diào)用代碼調(diào)用代碼 Session session = sessionFactory.openSession;Transaction事務(wù)事務(wù) 概述:概述: 它將運用代碼從底層的事務(wù)虛現(xiàn)中籠統(tǒng)出來它將運用代碼從底層的事務(wù)虛現(xiàn)中籠統(tǒng)出來這這能夠是一個能夠是一個JDBC事務(wù),一個事務(wù),一個JTA用戶事務(wù)或者甚至是用戶事務(wù)或者甚至是一個公共對象懇求代理構(gòu)造一個公共對象懇求代理構(gòu)造CORBA允許運用允許運用經(jīng)過一組一致的經(jīng)過一組一致的API控制事務(wù)邊境。這有助于堅持控制事務(wù)邊境。這有助于堅持Hibernate運用在不同類型的執(zhí)行環(huán)境或容器中的可移運用在不同類型的執(zhí)行環(huán)境或容器中的可移植性。

16、植性。 調(diào)用代碼:調(diào)用代碼: Transaction tx = session.beginTransaction; 注:運用注:運用Hibernate進(jìn)展操作時增、刪、改必需顯進(jìn)展操作時增、刪、改必需顯示的調(diào)用示的調(diào)用Transaction默許:默許:autoCommit=false。Query 概述:概述: Query查詢接口允許他在數(shù)據(jù)庫上執(zhí)行查詢并控制查詢接口允許他在數(shù)據(jù)庫上執(zhí)行查詢并控制查詢?nèi)绾螆?zhí)行。查詢語句運用查詢?nèi)绾螆?zhí)行。查詢語句運用HQL或者本地數(shù)據(jù)庫的或者本地數(shù)據(jù)庫的SQL方言編寫。方言編寫。 調(diào)用代碼:調(diào)用代碼: Query query = session.createQue

17、ry“from User; 用戶的例子用戶的例子耐久化類耐久化類User.javapublic class User private Long id; private String name; private Date birthday; private String ; public User public UserString name,Date birthday,String .Get/Set映射文件映射文件User.hbm.xml 運用運用UserTest.javapublic void testCreate throws Exception Configuration cfg = n

18、ew Configuration; cfg.addURLUserTest.class.getResource/com/test/um/User.hbm.xml; SessionFactory sessionFactory = cfg.buildSessionFactory; Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; SimpleDateFormat format = new SimpleDateFormatyyyy-mm-dd; User user = new

19、 UserJack,format.parse1980-04-12,Jackyahoo ; session.saveuser; tx mit; assertNotNulluser.getId; session.clear; User user_2 = Usersession.getUser.class,user.getId; assertNotNulluser_2; session.close; 運用運用UserTest.java保管用戶:session.saveuser;修正用戶:session.updateuser;保管或修正用戶:session.saveOrUpdateuser;刪除用戶:

20、session.deleteuser;刪除一切用戶:session.delete“from User ;查詢用戶名為“test的用戶:Query query = session.createQueryfrom User where = :name;query.setParameter“test,user.getName; User findUser = User query.list.get0;三、三、Hibernate映射聲明映射聲明Mapping declarationhibernate-mapping一、類層次。class1、主鍵。id2、根本類型。property3

21、、自定義類。many-to-one | one-to-one4、集合。set | list | map | array4.1、one-to-many4.2、many-to-many5、子類。subclass | joined-subclass6、其它。component | any等二、查詢語句。Query闡明:一個Hibernate-mapping中可以同時定義多個類。Query非常簡單,主要是用來放置查詢語句,便于對數(shù)據(jù)庫查詢的一致管理和優(yōu)化。hibernate-mapping1、schema可選:數(shù)據(jù)庫Schema Name2、default-cascade可選,默以為none:默許的級

22、聯(lián)風(fēng)格3、auto-import可選,默以為true:能否在查詢中只運用類名。不用加package名字。4、package可選,假設(shè)該映射文件中定義的類名不包含package,那么運用這里定義的package作為類名的前綴。一、類層次一、類層次class1、主鍵、主鍵-idid name=propertyName 1 type=typename 2 column=column_name 3 unsaved-value=any|none|null|id_value 4 1、name 可選 :標(biāo)識屬性的稱號。2、type可選:標(biāo)識Hibernate類型的名字。3、column可選默以為屬性名:對應(yīng)

23、數(shù)據(jù)庫表的主鍵字段的名字。4、unsaved-value可選默以為null:這個值用來判別對象能否要保管。 1.1主鍵生成戰(zhàn)略主鍵生成戰(zhàn)略generator generator 主鍵生成器,每個主鍵都必需定義相應(yīng)的主鍵生成戰(zhàn)略。主鍵生成器,每個主鍵都必需定義相應(yīng)的主鍵生成戰(zhàn)略。它用來為耐久化類實例生成獨一的標(biāo)識。它用來為耐久化類實例生成獨一的標(biāo)識。 Hibernate內(nèi)置的主鍵生成戰(zhàn)略內(nèi)置的主鍵生成戰(zhàn)略 數(shù)據(jù)庫提供的主鍵生成機(jī)制。數(shù)據(jù)庫提供的主鍵生成機(jī)制。identity、sequence序序列列 。 外部程序提供的主鍵生成機(jī)制。外部程序提供的主鍵生成機(jī)制。increment 遞增遞增 ,hi

24、lo上下位上下位 ,seqhilo運用序列的上下位運用序列的上下位 ,uuid.hex運用了運用了IP地址地址+JVM的啟動時間準(zhǔn)確到的啟動時間準(zhǔn)確到1/4秒秒+系統(tǒng)時間系統(tǒng)時間+一個計數(shù)器值在一個計數(shù)器值在JVM中獨一中獨一 ,uuid.string。 其它。其它。native本地,本地,assigned手工指定,手工指定,foreign外部援用。外部援用。2、根本類型、根本類型property4 update, insert 可選 - 默以為 true :闡明在用于UPDATE 和/或 INSERT的SQL語句中能否包含這個字段。 5 formula 可選: 一個SQL表達(dá)式,定義了這個計

25、算computed 屬性的值。計算屬性沒有和它對應(yīng)的數(shù)據(jù)庫字段。3.1、自定義類、自定義類many-to-one3 class 可選 - 默許是經(jīng)過反射得到屬性類型: 關(guān)聯(lián)的類的名字。 4 cascade級聯(lián) 可選: 指明哪些操作會從父對象級聯(lián)到關(guān)聯(lián)的對象。 5 o u t e r - j o i n 外 銜 接 可 選 - 默 以 為 自 動 hibernate.use_outer_join 7 property-ref: 可選 指定關(guān)聯(lián)類的一個屬性,這個屬性將會和本外相對應(yīng)。例子例子:User-Group3.2、自定義類one-to-one 一對一關(guān)聯(lián):主鍵關(guān)聯(lián)和獨一外鍵關(guān)聯(lián)兩種方式。一對

26、一關(guān)聯(lián):主鍵關(guān)聯(lián)和獨一外鍵關(guān)聯(lián)兩種方式。 例子:例子:User-IdCard外鍵關(guān)聯(lián)外鍵關(guān)聯(lián) 4、集合、集合Set1 name 集合屬性的稱號 2 table 可選目的關(guān)聯(lián)數(shù)據(jù)庫表3 lazy 可選默以為false允許延遲加載lazy initialization 4 inverse 可選默以為false 標(biāo)志有哪一方來維護(hù)關(guān)聯(lián)關(guān)系雙向關(guān)聯(lián)中運用。 5 cascade 可選默以為none 讓操作級聯(lián)到子實體 6 order-by 可選, 僅用于jdk1.4 指定表的字段一個或幾個再加上asc或者desc可選, 定義Map,Set和Bag的迭代順序 7 where 可選 指定恣意的SQL whe

27、re條件8 outer-join可選-默以為auto能否運用外聯(lián)接4.1、one-to-many概念:一對多關(guān)聯(lián)直接銜接兩個類對應(yīng)的表概念:一對多關(guān)聯(lián)直接銜接兩個類對應(yīng)的表,而沒有中而沒有中間集合表。實現(xiàn)了一個一對多的關(guān)系模型,例如:間集合表。實現(xiàn)了一個一對多的關(guān)系模型,例如:User-Address這里的這里的Java集合必需滿足下面的語義:集合必需滿足下面的語義:map,set或或list中不能包含中不能包含null值值一個被包含的實體的實例只能被包含在一個集合的實例一個被包含的實體的實例只能被包含在一個集合的實例中中1 class必需必需:被關(guān)聯(lián)類的稱號。被關(guān)聯(lián)類的稱號。例子例子one-

28、to-many:User-Address 4.2、many-to-many1 column必需: 中間映射表中,關(guān)聯(lián)目的表的關(guān)聯(lián)字段2 class 必需: 類名,關(guān)聯(lián)目的類3 outer-join 可選 - 默以為auto 11 column必需:當(dāng)前表的關(guān)聯(lián)字段例子例子many to many:student-trainClass5、承繼、承繼 承繼實現(xiàn)的三中戰(zhàn)略承繼實現(xiàn)的三中戰(zhàn)略 單表承繼。每棵類承繼樹運用一個表單表承繼。每棵類承繼樹運用一個表table per class hierarchy 詳細(xì)表承繼。每個子類一個表詳細(xì)表承繼。每個子類一個表table per subclass 類表承

29、繼。每個詳細(xì)類一個表類表承繼。每個詳細(xì)類一個表table per concrete class有一些限制有一些限制 單表承繼單表承繼 例子承繼:例子承繼:user-student雙向關(guān)聯(lián)雙向關(guān)聯(lián) 概念:雙向關(guān)聯(lián)允許經(jīng)過關(guān)聯(lián)的任一端訪問另外一端。概念:雙向關(guān)聯(lián)允許經(jīng)過關(guān)聯(lián)的任一端訪問另外一端。在在Hibernate中中, 支持兩種類型的雙向關(guān)聯(lián)。支持兩種類型的雙向關(guān)聯(lián)。 一對多一對多one-to-many,Set或者或者bag值在一端值在一端, 單獨值單獨值非集合在另外一端非集合在另外一端 。 多對多多對多many-to-many,兩端都是,兩端都是set或或bag值。值。例子雙向關(guān)聯(lián):例子雙向

30、關(guān)聯(lián):group-user 例子:從例子:從Java代碼看代碼看group-user雙向關(guān)雙向關(guān)聯(lián)的聯(lián)的inverse 概念:概念:inverse用來標(biāo)識雙向關(guān)聯(lián)的關(guān)聯(lián)關(guān)系由哪一端維用來標(biāo)識雙向關(guān)聯(lián)的關(guān)聯(lián)關(guān)系由哪一端維護(hù)。默許護(hù)。默許inverse的值為的值為false,由自動方擔(dān)任維護(hù)關(guān)聯(lián)關(guān),由自動方擔(dān)任維護(hù)關(guān)聯(lián)關(guān)系;假設(shè)設(shè)為系;假設(shè)設(shè)為true,那么由反向一端維護(hù)關(guān)聯(lián)關(guān)系。,那么由反向一端維護(hù)關(guān)聯(lián)關(guān)系。 用例:我們假設(shè)曾經(jīng)有一個用例:我們假設(shè)曾經(jīng)有一個Group類的實例:類的實例:adminGroup,如今我們要新增一個用戶,并且將用戶,如今我們要新增一個用戶,并且將用戶分配到分配到adm

31、inGroup中。中。 inverse=“false,由自動方,由自動方Group擔(dān)任維護(hù)擔(dān)任維護(hù)group-user的關(guān)聯(lián)關(guān)系的關(guān)聯(lián)關(guān)系. User user = new User“Jak; adminGroup.getUsers.adduser; session.saveuser;session.updategroup; inverse=“true,由,由Group的反向段的反向段User擔(dān)任維護(hù)關(guān)聯(lián)擔(dān)任維護(hù)關(guān)聯(lián)關(guān)系。關(guān)系。 User user = new User“Jak; user .setGroupadminGroup;session.saveuser;四、耐久化對象的形狀四、耐久化

32、對象的形狀 瞬時對象瞬時對象Transient Objects:運用:運用new 操作符初始操作符初始化的對象不是立刻就耐久的。它們的形狀是瞬時的,也化的對象不是立刻就耐久的。它們的形狀是瞬時的,也就是說它們沒有任何跟數(shù)據(jù)庫表相關(guān)聯(lián)的行為,只需運就是說它們沒有任何跟數(shù)據(jù)庫表相關(guān)聯(lián)的行為,只需運用不再援用這些對象不再被任何其它對象所援用,用不再援用這些對象不再被任何其它對象所援用,它們的形狀將會喪失,并由渣滓回收機(jī)制回收。它們的形狀將會喪失,并由渣滓回收機(jī)制回收。 耐久化對耐久化對Persist Objects:耐久實例是任何具有數(shù):耐久實例是任何具有數(shù)據(jù)庫標(biāo)識的實例。它有耐久化管理器據(jù)庫標(biāo)識的

33、實例。它有耐久化管理器Session一致管理,一致管理,耐久實例是在事務(wù)中進(jìn)展操作的耐久實例是在事務(wù)中進(jìn)展操作的它們的形狀在事務(wù)它們的形狀在事務(wù)終了時同數(shù)據(jù)庫進(jìn)展同步。當(dāng)事務(wù)提交時,經(jīng)過執(zhí)行終了時同數(shù)據(jù)庫進(jìn)展同步。當(dāng)事務(wù)提交時,經(jīng)過執(zhí)行SQL的的INSERT、UPDATE和和DELETE語句把內(nèi)存中的語句把內(nèi)存中的形狀同步到數(shù)據(jù)庫中。形狀同步到數(shù)據(jù)庫中。 離線對象離線對象Detached Objects:Session封鎖之后,耐封鎖之后,耐久化對象就變?yōu)殡x線對象。離線表示這個對象不能再與久化對象就變?yōu)殡x線對象。離線表示這個對象不能再與數(shù)據(jù)庫堅持同步,它們不再受數(shù)據(jù)庫堅持同步,它們不再受Hib

34、ernate管理。管理。耐久化對象的生命周期耐久化對象的生命周期lifecycleHibernate臟數(shù)據(jù)字段撿入 檢索一個用戶,并將它的用戶名更改為檢索一個用戶,并將它的用戶名更改為“Mary Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; User user = User session.getUser.class, userId; user.setNameMary; tx mit; session.close;耐久化對象必需獨一耐久化對象必需獨一 一個一個Se

35、ssion中不能同時存在兩個中不能同時存在兩個ID一樣的耐久化對象一樣的耐久化對象 例如:例如:id為為userId的的user_1對象曾經(jīng)存在對象曾經(jīng)存在Session中,這中,這時假設(shè)時假設(shè)Session中試圖產(chǎn)生一個中試圖產(chǎn)生一個user_2對象!對象! Session session = sessionFactory.openSession; Transaction tx = session.beginTransaction; User user_1 = Usersession.getUser.class,userId; User user_2 = new UseruserId,Mar

36、y; session.updateuser_2; 最后將會產(chǎn)生異常:最后將會產(chǎn)生異常:net.sf.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 處置方法:處置方法: 運用運用evict 方法將方法將user_1實例從實例從session中中去除。去除。session.evictuser_1;五、五、Hibernate查詢查詢 概述:數(shù)據(jù)查詢與檢索是概述:數(shù)據(jù)查詢與檢索是Hibernate中

37、的一個亮點。相中的一個亮點。相對其他對其他ORM實現(xiàn)而言,實現(xiàn)而言,Hibernate提供了靈敏多樣的查提供了靈敏多樣的查詢機(jī)制。詢機(jī)制。 規(guī)范化對象查詢規(guī)范化對象查詢Criteria Query:以對象的方式進(jìn):以對象的方式進(jìn)展查詢,將查詢語句封裝為對象操作。優(yōu)點:可讀性好,展查詢,將查詢語句封裝為對象操作。優(yōu)點:可讀性好,符合符合Java 程序員的編碼習(xí)慣。缺陷:不夠成熟,不支持程序員的編碼習(xí)慣。缺陷:不夠成熟,不支持投影投影projection或統(tǒng)計函數(shù)或統(tǒng)計函數(shù)aggregation Hibernate言語查詢言語查詢Hibernate Query Language,HQL:它是完全面

38、向?qū)ο蟮牟樵冋Z句,查詢功能非常:它是完全面向?qū)ο蟮牟樵冋Z句,查詢功能非常強(qiáng)大,具備承繼、多態(tài)和關(guān)聯(lián)等特性強(qiáng)大,具備承繼、多態(tài)和關(guān)聯(lián)等特性 。Hibernate官方官方引薦運用引薦運用HQL進(jìn)展查詢。進(jìn)展查詢。 Native SQL Queries原生原生SQL查詢:直接運用數(shù)據(jù)查詢:直接運用數(shù)據(jù)庫提供的庫提供的SQL方言進(jìn)展查詢。方言進(jìn)展查詢。例子:規(guī)范化對象查詢例子:規(guī)范化對象查詢Criteria Query 簡單例子:查詢用戶名以簡單例子:查詢用戶名以“J開頭的一切用戶。開頭的一切用戶。Criteria criteria = session.createCriteriaUser.class

39、; criteria.addExpression.likename,J%; List users = criteria.list;Hibernate言語查詢言語查詢Hibernate Query Language,HQL HQL用面向?qū)ο蟮姆绞缴捎妹嫦驅(qū)ο蟮姆绞缴蒘QL 以類和屬性來替代表和數(shù)據(jù)列以類和屬性來替代表和數(shù)據(jù)列 支持多態(tài)支持多態(tài) 支持各種關(guān)聯(lián)支持各種關(guān)聯(lián) 減少了減少了SQL的冗余的冗余 HQL支持一切的關(guān)系數(shù)據(jù)庫操作支持一切的關(guān)系數(shù)據(jù)庫操作 銜接銜接joins,包括包括Inner/outer/full joins,笛卡爾積,笛卡爾積cartesian products 投影投影

40、projection 聚合聚合Aggregation,max, avg和分組和分組group 排序排序Ordering 子查詢子查詢Subqueries SQL函數(shù)函數(shù)SQL function calls例子:例子: Hibernate言語查詢言語查詢Hibernate Query Language,HQL 簡單例子:查詢用戶名以簡單例子:查詢用戶名以“J開頭的一切用戶。開頭的一切用戶。Query query = session.createQueryfrom User user where like J%; List users = query.list; 復(fù)雜例子:從復(fù)雜例子:從User和和

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論