Hibernate 5 教程_第1頁(yè)
Hibernate 5 教程_第2頁(yè)
Hibernate 5 教程_第3頁(yè)
Hibernate 5 教程_第4頁(yè)
Hibernate 5 教程_第5頁(yè)
已閱讀5頁(yè),還剩220頁(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、Hello Hibernate什么是 Hibernate ?n一個(gè)框架n一個(gè) Java 領(lǐng)域的持久化持久化框架n一個(gè) ORM 框架框架對(duì)象的持久化n 狹義的理解,“持久化”僅僅指把對(duì)象永久保存到數(shù)據(jù)庫(kù)中n 廣義的理解,“持久化”包括和數(shù)據(jù)庫(kù)相關(guān)的各種操作:保存:把對(duì)象永久保存到數(shù)據(jù)庫(kù)中。更新:更新數(shù)據(jù)庫(kù)中對(duì)象(記錄)的狀態(tài)。刪除:從數(shù)據(jù)庫(kù)中刪除一個(gè)對(duì)象。查詢:根據(jù)特定的查詢條件,把符合查詢條件的一個(gè)或多個(gè)對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中。加載:根據(jù)特定的OID,把一個(gè)對(duì)象從數(shù)據(jù)庫(kù)加載到內(nèi)存中。為了在系統(tǒng)中能夠找到所需對(duì)象,需要為每一個(gè)對(duì)象分配一個(gè)唯一的標(biāo)識(shí)號(hào)。為了在系統(tǒng)中能夠找到所需對(duì)象,需要為每一個(gè)

2、對(duì)象分配一個(gè)唯一的標(biāo)識(shí)號(hào)。在關(guān)系數(shù)據(jù)庫(kù)中稱之為主鍵,而在對(duì)象術(shù)語(yǔ)中,則叫做對(duì)象標(biāo)識(shí)在關(guān)系數(shù)據(jù)庫(kù)中稱之為主鍵,而在對(duì)象術(shù)語(yǔ)中,則叫做對(duì)象標(biāo)識(shí)(Object identifier-OID). ORMn ORM(Object/Relation Mapping): 對(duì)象對(duì)象/關(guān)系關(guān)系映射映射ORM 主要解決對(duì)象-關(guān)系的映射ORM的思想:將關(guān)系數(shù)據(jù)庫(kù)中表中的記錄映射成為對(duì)象,以對(duì)象的形式展現(xiàn),程序員可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)對(duì)象的操作程序員可以把對(duì)數(shù)據(jù)庫(kù)的操作轉(zhuǎn)化為對(duì)對(duì)象的操作。ORM 采用元數(shù)據(jù)元數(shù)據(jù)來(lái)描述對(duì)象-關(guān)系映射細(xì)節(jié), 元數(shù)據(jù)通常采用 XML 格式, 并且存放在專門的對(duì)象-關(guān)系映射文件中.O

3、RM流行的ORM框架n Hibernate:非常優(yōu)秀、成熟的 ORM 框架。完成對(duì)象的持久化操作Hibernate 允許開(kāi)發(fā)者采用面向?qū)ο蟮姆绞讲捎妹嫦驅(qū)ο蟮姆绞絹?lái)操作關(guān)系數(shù)據(jù)庫(kù)。消除那些針對(duì)特定數(shù)據(jù)庫(kù)廠商的 SQL 代碼n MyBatis:相比 Hibernate 靈活高,運(yùn)行速度快開(kāi)發(fā)速度慢,不支持純粹的面向?qū)ο蟛僮鳎枋煜ql語(yǔ) 句,并且熟練使用sql語(yǔ)句優(yōu)化功能 n TopLinkn OJBHibernate與Jdbc代碼對(duì)比Hibernate 實(shí)現(xiàn)JDBC 實(shí)現(xiàn)Eclipse安裝 hibernate 插件n安裝方法說(shuō)明:nURL:/tools/

4、Eclipse安裝 hibernate 插件n從頁(yè)面上可以看到,工具分為兩種,一種是完整版本的Eclipse插件(左),一種是只支持Jboss社區(qū)版的Eclipse插件(只有插件)(右),我們下載右邊的,它已經(jīng)足夠使用了。點(diǎn)擊Download:Eclipse安裝 hibernate 插件nJBoss已經(jīng)告訴我們下載插件的地址了:nURL:/jbosstools/neon/stable/updates/ Eclipse安裝 hibernate 插件n點(diǎn)擊Help - Install New Software.Eclipse安裝 hibernate

5、插件n點(diǎn)擊Add. Eclipse安裝 hibernate 插件n在Add Site對(duì)話框中, 輸入name的值為Jboss Tools,location的值為/jbosstools/neon/stable/updates/ 點(diǎn)擊OK按鈕Eclipse安裝 hibernate 插件n耐心等待,直到出現(xiàn)提示,選擇所有與Hibernate有關(guān)的,其余不裝。去掉Contact all update sites during install to find required software.上面的勾(一定要去掉,否則安裝會(huì)很慢),點(diǎn)擊nextEclip

6、se安裝 hibernate 插件Eclipse安裝 hibernate 插件n點(diǎn)擊accept所在的單選按鈕,接受協(xié)議,點(diǎn)擊nextEclipse安裝 hibernate 插件n等待安裝結(jié)束Eclipse安裝 hibernate 插件n彈出提示信息,點(diǎn)擊OKEclipse安裝 hibernate 插件n提示我們Eclipse需要重啟以完成安裝,點(diǎn)擊OKEclipse安裝 hibernate 插件n判斷安裝是否成功的標(biāo)準(zhǔn)是如果Eclipse的new選項(xiàng)里面有Hibernate配置文件的相關(guān)選項(xiàng),就說(shuō)明安裝是成功的。準(zhǔn)備 Hibernate 環(huán)境n 導(dǎo)入 Hibernate 必須的 jar 包:

7、n 加入數(shù)據(jù)庫(kù)驅(qū)動(dòng)的 jar 包: Hibernate開(kāi)發(fā)步驟hibernate.cfg.xml *.hbm.xml2. 創(chuàng)建持久化類創(chuàng)建持久化類3. 創(chuàng)建對(duì)象創(chuàng)建對(duì)象-關(guān)系映射文關(guān)系映射文件件4. 通過(guò)通過(guò) Hibernate API 編編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼1. 創(chuàng)建創(chuàng)建 Hibernate 配置文配置文件件1. 創(chuàng)建持久化 Java 類n 提供一個(gè)無(wú)參的構(gòu)造器提供一個(gè)無(wú)參的構(gòu)造器:使Hibernate可以使用Constructor.newInstance() 來(lái)實(shí)例化持久化類n 提供一個(gè)標(biāo)識(shí)屬性提供一個(gè)標(biāo)識(shí)屬性(identifier property): 通常映射為數(shù)據(jù)庫(kù)

8、表的主鍵字段. 如果沒(méi)有該屬性,一些功能將不起作用,如:Session.saveOrUpdate()n 為類的持久化類字段聲明訪問(wèn)方法為類的持久化類字段聲明訪問(wèn)方法(get/set): Hibernate對(duì)JavaBeans 風(fēng)格的屬性實(shí)行持久化。n 使用非使用非 final 類類: 在運(yùn)行時(shí)生成代理是 Hibernate 的一個(gè)重要的功能. 如果持久化類沒(méi)有實(shí)現(xiàn)任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 類, 則無(wú)法生成 CGLIB 代理.n 重寫(xiě)重寫(xiě) eqauls 和和 hashCode 方法方法: 如果需要把持久化類的實(shí)例放到 Set 中(當(dāng)

9、需要進(jìn)行關(guān)聯(lián)映射時(shí)), 則應(yīng)該重寫(xiě)這兩個(gè)方法1. 創(chuàng)建持久化 Java 類n Hibernate 不要求持久化類繼承任何父類或?qū)崿F(xiàn)接口,這可以保證代碼不被污染。這就是Hibernate被稱為低侵入式設(shè)計(jì)的原因 2. 創(chuàng)建對(duì)象-關(guān)系映射文件n Hibernate 采用 XML 格式的文件來(lái)指定對(duì)象和關(guān)系數(shù)據(jù)之間的映射. 在運(yùn)行時(shí) Hibernate 將根據(jù)這個(gè)映射文件來(lái)生成各種 SQL 語(yǔ)句n 映射文件的擴(kuò)展名為 .hbm.xml指定類和表的映射指定持久化類的OID 和表的主鍵的映射映射類的屬性和表的字段指定對(duì)象標(biāo)識(shí)符生成器, 負(fù)責(zé)為 OID 生成唯一標(biāo)識(shí)符3. 創(chuàng)建 Hibernate 配置文

10、件n Hibernate 從其配置文件中讀取和數(shù)據(jù)庫(kù)連接的有關(guān)信息, 這個(gè)文件應(yīng)該位于應(yīng)用的 classpath 下.指定連接數(shù)據(jù)庫(kù)的基本屬性信息指定數(shù)據(jù)庫(kù)所使用的 SQL 方言指定程序運(yùn)行時(shí)是否在控制臺(tái)輸出 SQL 語(yǔ)句指定程序運(yùn)行時(shí)是否在數(shù)據(jù)庫(kù)自動(dòng)生成數(shù)據(jù)表指定程序需要關(guān)聯(lián)的映射文件指定是否對(duì)輸出 SQL 語(yǔ)句進(jìn)行格式化4. 通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼n 測(cè)試代碼(Hibernate 5.2.5)/1. 創(chuàng)建一個(gè) SessionFactory 對(duì)象StandardServiceRegistry standardRegistry = new StandardServi

11、ceRegistryBuilder() .configure(hibernate.cfg.xml).build();Metadata metadata = new MetadataSources(standardRegistry) .getMetadataBuilder().build();SessionFactoryBuilder sessionFactoryBuilder = metadata.getSessionFactoryBuilder();SessionFactory sessionFactory = sessionFactoryBuilder.build();/2. 創(chuàng)建一個(gè) S

12、ession 對(duì)象Session session = sessionFactory.openSession();/3. 開(kāi)啟事務(wù)Transaction transaction = session.beginTransaction();/4. 執(zhí)行保存操作News news = new News(Java12345, ATGUIGU, new Date(new java.util.Date().getTime();session.save(news);/5. 提交事務(wù) mit();/6. 關(guān)閉 Sessionsession.close();/7. 關(guān)閉 SessionFactory 對(duì)象sess

13、ionFactory.close();4. 通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼n 運(yùn)行效果:控制臺(tái)打印輸出SQL語(yǔ)句4. 通過(guò)Hibernate API編寫(xiě)訪問(wèn)數(shù)據(jù)庫(kù)的代碼n 運(yùn)行效果:數(shù)據(jù)庫(kù)增加一張表,表中插入一條字段Helloworldn 使用 Hibernate 進(jìn)行數(shù)據(jù)持久化操作,通常有如下步驟:編寫(xiě)持久化類: POJO + 映射文件獲取 Configuration 對(duì)象獲取 SessionFactory 對(duì)象獲取 Session,打開(kāi)事務(wù)用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫(kù)關(guān)閉事務(wù),關(guān)閉 SessionConfiguration 類n Configuration 類負(fù)責(zé)管理 H

14、ibernate 的配置信息。包括如下內(nèi)容:Hibernate 運(yùn)行的底層信息:數(shù)據(jù)庫(kù)的URL、用戶名、密碼、JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫(kù)Dialect,數(shù)據(jù)庫(kù)連接池等(對(duì)應(yīng) hibernate.cfg.xml 文件)。持久化類與數(shù)據(jù)表的映射關(guān)系(*.hbm.xml 文件)n 創(chuàng)建 Configuration 的兩種方式屬性文件(perties):Configuration cfg = new Configuration();Xml文件(hibernate.cfg.xml)Configuration cfg = new Configuration().configure()

15、;Configuration 的 configure 方法還支持帶參數(shù)的訪問(wèn):File file = new File(“simpleit.xml”);Configuration cfg = new Configuration().configure(file); SessionFactory 接口n 針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,是線程安全的。 n SessionFactory 對(duì)象一旦構(gòu)造完畢,即被賦予特定的配置信息n SessionFactory是生成Session的工廠n 構(gòu)造 SessionFactory 很消耗資源,一般情況下一個(gè)應(yīng)用中只初始化一個(gè) SessionFa

16、ctory 對(duì)象。n Hibernate5 使用StandardServiceRegistry來(lái)獲取SessionFactoryn Hibernate5 中創(chuàng)建 SessionFactory 的步驟Session 接口n Session 是應(yīng)用程序與數(shù)據(jù)庫(kù)之間交互操作的一個(gè)單線程對(duì)象單線程對(duì)象,是 Hibernate 運(yùn)作的中心,所有持久化對(duì)象必須在 session 的管理下才可以進(jìn)行持久化操作。此對(duì)象的生命周期很短。Session 對(duì)象有一個(gè)一級(jí)緩存,顯式執(zhí)行 flush 之前,所有的持久層操作的數(shù)據(jù)都緩存在 session 對(duì)象處。相當(dāng)于相當(dāng)于 JDBC 中的中的 Connection。S

17、ession 接口n 持久化類與 Session 關(guān)聯(lián)起來(lái)后就具有了持久化的能力。n Session 類的方法:取得持久化對(duì)象的方法: get() load()持久化對(duì)象都得保存,更新和刪除:save(),update(),saveOrUpdate(),delete()開(kāi)啟事務(wù): beginTransaction().管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等Transaction(事務(wù))n 代表一次原子操作,它具有數(shù)據(jù)庫(kù)事務(wù)的概念。所有持久層都應(yīng)該在事務(wù)管理下進(jìn)行,即使是只讀操作。 Transaction tx =

18、session.beginTransaction();n 常用方法:commit():提交相關(guān)聯(lián)的session實(shí)例rollback():撤銷事務(wù)操作wasCommitted():檢查事務(wù)是否提交Hibernate 配置文件的兩個(gè)配置項(xiàng)n hbm2ddl.auto:該屬性可幫助程序員實(shí)現(xiàn)正向工程, 即由 java 代碼生成數(shù)據(jù)庫(kù)腳本, 進(jìn)而生成具體的表結(jié)構(gòu). 。取值 create | update | create-drop | validatecreate : 會(huì)根據(jù) .hbm.xml 文件來(lái)生成數(shù)據(jù)表, 但是每次運(yùn)行都會(huì)刪除上一次的表 ,重新生成表, 哪怕二次沒(méi)有任何改變 create-d

19、rop : 會(huì)根據(jù) .hbm.xml 文件生成表,但是SessionFactory一關(guān)閉, 表就自動(dòng)刪除 update : 最常用的屬性值最常用的屬性值,也會(huì)根據(jù) .hbm.xml 文件生成表, 但若 .hbm.xml 文件和數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù)表的表結(jié)構(gòu)不同, Hiberante 將更新數(shù)據(jù)表結(jié)構(gòu),但不會(huì)刪除已有的行和列 validate : 會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較, 若 .hbm.xml 文件中的列在數(shù)據(jù)表中不存在,則拋出異常format_sql:是否將 SQL 轉(zhuǎn)化為格式良好的 SQL . 取值 true | false通過(guò) Session 操縱對(duì)象Session 概述n Session

20、 接口是 Hibernate 向應(yīng)用程序提供的操縱數(shù)據(jù)庫(kù)的最主要的接口, 它提供了基本的保存提供了基本的保存, 更新更新, 刪除和刪除和加載加載 Java 對(duì)象的方法對(duì)象的方法.n Session 具有一個(gè)緩存具有一個(gè)緩存, 位于緩存中的對(duì)象稱為持久化對(duì)象位于緩存中的對(duì)象稱為持久化對(duì)象, 它和數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng)它和數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng). Session 能夠在某些時(shí)間點(diǎn), 按照緩存中對(duì)象的變化來(lái)執(zhí)行相關(guān)的 SQL 語(yǔ)句, 來(lái)同步更新數(shù)據(jù)庫(kù), 這一過(guò)程被稱為刷新緩存(flush)n 站在持久化的角度站在持久化的角度, Hibernate 把對(duì)象分為把對(duì)象分為 4 種狀態(tài)種狀態(tài): 持久化狀態(tài)

21、, 臨時(shí)狀態(tài), 游離狀態(tài), 刪除狀態(tài). Session 的特定方法能使對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài). Session 緩存n 在 Session 接口的實(shí)現(xiàn)中包含一系列的 Java 集合, 這些 Java 集合構(gòu)成了 Session 緩存. 只要 Session 實(shí)例沒(méi)有結(jié)束生命周期, 且沒(méi)有清理緩存,則存放在它緩存中的對(duì)象也不會(huì)結(jié)束生命周期n Session 緩存可減少 Hibernate 應(yīng)用程序訪問(wèn)數(shù)據(jù)庫(kù)的頻率。會(huì)向數(shù)據(jù)庫(kù)發(fā)送幾條 SQL ?News 對(duì)象引用變量 news引用變量 new2Session 緩存操作 Session 緩存Session 緩存數(shù)據(jù)庫(kù)News 對(duì)象news

22、記錄flush()News 對(duì)象Session 緩存Session 緩存clear()reflesh()flush 緩存n flush:Session 按照緩存中對(duì)象的屬性變化來(lái)同步更新數(shù)據(jù)庫(kù)n 默認(rèn)情況下 Session 在以下時(shí)間點(diǎn)刷新緩存:顯式調(diào)用 Session 的的 flush() 方法當(dāng)應(yīng)用程序調(diào)用 Transaction 的的 commit()()方法的時(shí), 該方法先 flush ,然后在向數(shù)據(jù)庫(kù)提交事務(wù)當(dāng)應(yīng)用程序執(zhí)行一些查詢(HQL, Criteria)操作時(shí),如果緩存中持久化對(duì)象的屬性已經(jīng)發(fā)生了變化,會(huì)先 flush 緩存,以保證查詢結(jié)果能夠反映持久化對(duì)象的最新?tīng)顟B(tài)n flu

23、sh 緩存的例外情況: 如果對(duì)象使用 native 生成器生成 OID, 那么當(dāng)調(diào)用 Session 的 save() 方法保存對(duì)象時(shí), 會(huì)立即執(zhí)行向數(shù)據(jù)庫(kù)插入該實(shí)體的 insert 語(yǔ)句.n commit() 和 flush() 方法的區(qū)別:flush 執(zhí)行一系列 sql 語(yǔ)句,但不提交事務(wù);commit 方法先調(diào)用flush() 方法,然后提交事務(wù). 意味著提交事務(wù)意味著對(duì)數(shù)據(jù)庫(kù)操作永久保存下來(lái)。Hibernate 主鍵生成策略設(shè)定刷新緩存的時(shí)間點(diǎn)n 若希望改變 flush 的默認(rèn)時(shí)間點(diǎn), 可以通過(guò) Session 的 setFlushMode() 方法顯式設(shè)定 flush 的時(shí)間點(diǎn) 數(shù)據(jù)

24、庫(kù)的隔離級(jí)別n 對(duì)于同時(shí)運(yùn)行的多個(gè)事務(wù), 當(dāng)這些事務(wù)訪問(wèn)數(shù)據(jù)庫(kù)中相同的數(shù)據(jù)時(shí), 如果沒(méi)有采取必要的隔離機(jī)制, 就會(huì)導(dǎo)致各種并發(fā)問(wèn)題:臟讀臟讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了已經(jīng)被 T2 更新但還沒(méi)有被提交沒(méi)有被提交的字段. 之后, 若 T2 回滾, T1讀取的內(nèi)容就是臨時(shí)且無(wú)效的.不可重復(fù)讀不可重復(fù)讀: 對(duì)于兩個(gè)事物 T1, T2, T1 讀取了一個(gè)字段, 然后 T2 更新更新了該字段. 之后, T1再次讀取同一個(gè)字段, 值就不同了.幻讀幻讀: 對(duì)于兩個(gè)事物 T1, T2, T1 從一個(gè)表中讀取了一個(gè)字段, 然后 T2 在該表中插入插入了一些新的行. 之后, 如果 T1 再次讀取

25、同一個(gè)表, 就會(huì)多出幾行.n 數(shù)據(jù)庫(kù)事務(wù)的隔離性: 數(shù)據(jù)庫(kù)系統(tǒng)必須具有隔離并發(fā)運(yùn)行各個(gè)事務(wù)的能力, 使它們不會(huì)相互影響, 避免各種并發(fā)問(wèn)題. n 一個(gè)事務(wù)與其他事務(wù)隔離的程度稱為隔離級(jí)別. 數(shù)據(jù)庫(kù)規(guī)定了多種事務(wù)隔離級(jí)別, 不同隔離級(jí)別對(duì)應(yīng)不同的干擾程度, 隔離級(jí)別越高, 數(shù)據(jù)一致性就越好, 但并發(fā)性越弱數(shù)據(jù)庫(kù)的隔離級(jí)別n 數(shù)據(jù)庫(kù)提供的 4 種事務(wù)隔離級(jí)別:n Oracle 支持的 2 種事務(wù)隔離級(jí)別:READ COMMITED, SERIALIZABLE. Oracle 默認(rèn)的事務(wù)隔離級(jí)別為: READ COMMITED n Mysql 支持 4 種事務(wù)隔離級(jí)別. Mysql 默認(rèn)的事務(wù)隔離級(jí)

26、別為: REPEATABLE READ在 MySql 中設(shè)置隔離級(jí)別n 每啟動(dòng)一個(gè) Mysql 程序, 就會(huì)獲得一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)連接. 每個(gè)數(shù)據(jù)庫(kù)連接都有一個(gè)全局變量 tx_isolation, 表示當(dāng)前的事務(wù)隔離級(jí)別. MySQL 默認(rèn)的隔離級(jí)別為 Repeatable Readn 查看當(dāng)前的隔離級(jí)別: SELECT tx_isolation;n 設(shè)置當(dāng)前 MySQL 連接的隔離級(jí)別: set transaction isolation level read committed;n 設(shè)置數(shù)據(jù)庫(kù)系統(tǒng)的全局的隔離級(jí)別: set global transaction isolation level

27、 read committed;在Hibernate中設(shè)置隔離級(jí)別n JDBC 數(shù)據(jù)庫(kù)連接使用數(shù)據(jù)庫(kù)系統(tǒng)默認(rèn)的隔離級(jí)別. 在 Hibernate 的配置文件中可以顯式的設(shè)置隔離級(jí)別. 每一個(gè)隔離級(jí)別都對(duì)應(yīng)一個(gè)整數(shù):1. READ UNCOMMITED2. READ COMMITED4. REPEATABLE READ8. SERIALIZEABLEn Hibernate 通過(guò)為 Hibernate 映射文件指定 hibernate.connection.isolation 屬性來(lái)設(shè)置事務(wù)的隔離級(jí)別持久化對(duì)象的狀態(tài)n 站在持久化的角度站在持久化的角度, Hibernate 把對(duì)象分為把對(duì)象分為

28、4 種狀態(tài)種狀態(tài): 持久化狀態(tài), 臨時(shí)狀態(tài), 游離狀態(tài), 刪除狀態(tài). Session 的特定方法能使對(duì)象從一個(gè)狀態(tài)轉(zhuǎn)換到另一個(gè)狀態(tài). 持久化對(duì)象的狀態(tài)n 臨時(shí)對(duì)象(Transient): 在使用代理主鍵的情況下, OID 通常為通常為 null不處于不處于 Session 的緩存中的緩存中在數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)的記錄在數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng)的記錄n 持久化對(duì)象(也叫”托管”)(Persist):OID 不為不為 null位于位于 Session 緩存中緩存中若在數(shù)據(jù)庫(kù)中已經(jīng)有和其對(duì)應(yīng)的記錄, 持久化對(duì)象和數(shù)據(jù)庫(kù)中的相持久化對(duì)象和數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng)關(guān)記錄對(duì)應(yīng)Session 在在 flush 緩存時(shí)緩存

29、時(shí), 會(huì)根據(jù)持久化對(duì)象的屬性變化會(huì)根據(jù)持久化對(duì)象的屬性變化, 來(lái)同來(lái)同步更新數(shù)據(jù)庫(kù)步更新數(shù)據(jù)庫(kù)在同一個(gè)在同一個(gè) Session 實(shí)例的緩存中實(shí)例的緩存中, 數(shù)據(jù)庫(kù)表中的每條記錄只對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的每條記錄只對(duì)應(yīng)唯一的持久化對(duì)象唯一的持久化對(duì)象持久化對(duì)象的狀態(tài)n 刪除對(duì)象(Removed)在數(shù)據(jù)庫(kù)中沒(méi)有和其 OID 對(duì)應(yīng)的記錄不再處于 Session 緩存中一般情況下, 應(yīng)用程序不該再使用被刪除的對(duì)象n 游離對(duì)象(也叫”脫管”) (Detached):OID 不為不為 null不再處于不再處于 Session 緩存中緩存中一般情況需下, 游離對(duì)象是由持久化對(duì)象轉(zhuǎn)變過(guò)來(lái)的, 因此在數(shù)據(jù)庫(kù)中可能還存在

30、與它對(duì)應(yīng)的記錄對(duì)象的狀態(tài)轉(zhuǎn)換圖臨時(shí)狀態(tài)持久化狀態(tài)游離狀態(tài)刪除狀態(tài)new 語(yǔ)句get()Load()Query.list()Query.uniqueResult()Query.iterator()Query.scoll()save()saveOrUpdate()persist()merge()evict()close()clear()update()saveOrUpdate()merge()delete()delete()垃圾回收垃圾回收垃圾回收1. 是否在 Session 緩存中2. 在數(shù)據(jù)表中是否有對(duì)應(yīng)的記錄Session 的 save() 方法n Session的save()方法使一個(gè)臨時(shí)

31、對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象n Session的save() 方法完成以下操作:把把News對(duì)象加入到對(duì)象加入到 Session 緩存中緩存中, 使它進(jìn)入持久化狀態(tài)使它進(jìn)入持久化狀態(tài)選用映射文件指定的標(biāo)識(shí)符生成器選用映射文件指定的標(biāo)識(shí)符生成器, 為持久化對(duì)象分配唯一的為持久化對(duì)象分配唯一的 OID. 在使用代理主鍵的情況下, setId()方法為對(duì)象設(shè)置OID是無(wú)效的.執(zhí)行save()方法之前,修改對(duì)象id的操作是無(wú)效的。計(jì)劃執(zhí)行一條計(jì)劃執(zhí)行一條insert語(yǔ)句:在語(yǔ)句:在flush緩存的時(shí)候緩存的時(shí)候n Hibernate通過(guò)持久化對(duì)象的OID來(lái)維持它和數(shù)據(jù)庫(kù)相關(guān)記錄的對(duì)應(yīng)關(guān)系. 當(dāng)News對(duì)象處于

32、持久化狀態(tài)時(shí),不允許程序不允許程序隨意修改它的隨意修改它的IDn persist()和和save()區(qū)別區(qū)別:當(dāng)對(duì)一個(gè)OID不為Null的對(duì)象執(zhí)行save()方法時(shí),會(huì)把該對(duì)象以一個(gè)新的oid保存到數(shù)據(jù)庫(kù)中;但執(zhí)行persist()方法時(shí)會(huì)拋出一個(gè)異常.Session 的 save() 方法Session的get()和load()方法n 都可以根據(jù)跟定的 OID 從數(shù)據(jù)庫(kù)中加載一個(gè)持久化對(duì)象n 區(qū)別:當(dāng)數(shù)據(jù)庫(kù)中不存在與 OID 對(duì)應(yīng)的記錄時(shí)Session沒(méi)有關(guān)閉且同時(shí)需要使用對(duì)象時(shí), load() 方法拋出 ObjectNotFoundException 異常, 而 get() 方法返回 nu

33、ll兩者采用不同的延遲檢索策略:延遲檢索策略:load 方法支持延遲加載方法支持延遲加載策略(返回的是代理對(duì)象)。而策略(返回的是代理對(duì)象)。而 get 不支持。不支持。load方法存在方法存在懶加載異常問(wèn)題懶加載異常問(wèn)題:由于:由于load使用的是延遲加使用的是延遲加載策略,返回的是代理對(duì)象。在使用對(duì)象之前提前關(guān)閉了載策略,返回的是代理對(duì)象。在使用對(duì)象之前提前關(guān)閉了session會(huì)發(fā)生懶加載異常。會(huì)發(fā)生懶加載異常。get方法不存在這個(gè)問(wèn)題。方法不存在這個(gè)問(wèn)題。Session的get()和load()方法load()方法:懶加載異常發(fā)生異常的原因:在發(fā)生異常的原因:在需要需要初始化代初始化代理

34、理對(duì)象之前已經(jīng)關(guān)閉了對(duì)象之前已經(jīng)關(guān)閉了 Sessionload方法返回的是代理對(duì)象方法返回的是代理對(duì)象Session 的 update() 方法n Session 的 update() 方法使一個(gè)游離對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象, 并且計(jì)劃執(zhí)行一條 update 語(yǔ)句.n 若希望 Session 僅當(dāng)修改了 News 對(duì)象的屬性時(shí), 才執(zhí)行 update() 語(yǔ)句, 可以把映射文件中 元素的 select-before-update 設(shè)為 true. 該屬性的默認(rèn)值為 falsen 當(dāng)當(dāng) update() 方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí)方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí), 如果在如果在 Session 的緩存中已經(jīng)存在相

35、同的緩存中已經(jīng)存在相同 OID 的持久化對(duì)象的持久化對(duì)象, 會(huì)拋出異常會(huì)拋出異常n 當(dāng) update() 方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí), 如果在數(shù)據(jù)庫(kù)中不存在相應(yīng)的記錄, 也會(huì)拋出異常. Session 的 update() 方法 需要注意的:1. 無(wú)論要更新的游離對(duì)象和數(shù)據(jù)表的記錄是否一致, 都會(huì)發(fā)送 UPDATE 語(yǔ)句.(如果為更新操作設(shè)置了觸發(fā)器則盲目發(fā)送的update語(yǔ)句會(huì)使得觸發(fā)器被錯(cuò)誤的執(zhí)行多次) 如果想讓 update 方法不再盲目的出發(fā) update 語(yǔ)句,需要在 .hbm.xml 文件的 class 節(jié)點(diǎn)設(shè)置select-before-update=true (默認(rèn)為 false)

36、. 但通常不需要設(shè)置該屬性. 2. 若數(shù)據(jù)表中沒(méi)有對(duì)應(yīng)的記錄, 但還調(diào)用了 update 方法, 會(huì)拋出異常3. 當(dāng) update() 方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí), 如果在 Session 的緩存中已經(jīng)存在相同 OID 的持久化對(duì)象, 會(huì)拋出異常. 因?yàn)樵谠?Session 緩存緩存中不能中不能有兩個(gè)有兩個(gè) OID 相同的對(duì)象相同的對(duì)象!設(shè)置select-before-update=true后的顯示效果OID不存在時(shí)執(zhí)行update()方法的異常Session 的 saveOrUpdate() 方法Session 的 saveOrUpdate() 方法n Session 的 saveOrUpdat

37、e() 方法同時(shí)包含了 save() 與 update() 方法的功能News 對(duì)象游離對(duì)象臨時(shí)對(duì)象update()save()判定對(duì)象為臨時(shí)對(duì)象的標(biāo)準(zhǔn) Java 對(duì)象的對(duì)象的 OID 為為 null 映射文件中為 設(shè)置了 unsaved-value 屬性, 并且 Java 對(duì)象的 OID 取值與這個(gè) unsaved-value 屬性值匹配Session 的 saveOrUpdate() 方法n 注意:1. 若 OID 不為 null, 但數(shù)據(jù)表中還沒(méi)有和其對(duì)應(yīng)的記錄. 會(huì)拋出一個(gè)異常. 2. 了解: OID 值等于 id 的 unsaved-value 屬性值的對(duì)象, 也被認(rèn)為是一個(gè)游離對(duì)象

38、Session 的 merge() 方法Session 的 merge() 方法news1 的狀態(tài)Session緩存中是否存在OID為1的News持久化對(duì)象數(shù)據(jù)庫(kù)中是否存在id為1的記錄從數(shù)據(jù)庫(kù)加載id為1的News持久化對(duì)象把new1對(duì)象的屬性拷貝到New持久化對(duì)象中,計(jì)劃執(zhí)行一條update語(yǔ)句游離對(duì)象存在不存在創(chuàng)建一個(gè)新的News對(duì)象,把new1對(duì)象的屬性拷貝到新建的News對(duì)象中,持久化這個(gè)News對(duì)象,計(jì)劃執(zhí)行一條insert語(yǔ)句返回News持久化對(duì)象的引用存在臨時(shí)對(duì)象不存在Session 的 delete() 方法n Session 的 delete() 方法既可以刪除一個(gè)游離對(duì)象

39、, 也可以刪除一個(gè)持久化對(duì)象n Session 的 delete() 方法處理過(guò)程計(jì)劃執(zhí)行一條 delete 語(yǔ)句把對(duì)象從 Session 緩存中刪除, 該對(duì)象進(jìn)入刪除狀態(tài).n Hibernate 的 cfg.xml 配置文件中有一個(gè) hibernate.use_identifier_rollback 屬性, 其默認(rèn)值為 false, 若把它設(shè)為 true, 將改變 delete() 方法的運(yùn)行行為: delete() 方法會(huì)把持久化對(duì)象或游離對(duì)象的 OID 設(shè)置為 null, 使它們變?yōu)榕R時(shí)對(duì)象Session 的 delete() 方法Session 的 delete() 方法n若OID在數(shù)

40、據(jù)表中沒(méi)有記錄則拋出異常Session 的 evict() 方法n從 session 緩存中把指定的持久化對(duì)象移除,對(duì)象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài)。通過(guò) Hibernate 調(diào)用存儲(chǔ)過(guò)程n Work 接口: 直接通過(guò) JDBC API 來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的操作通過(guò) Hibernate 調(diào)用存儲(chǔ)過(guò)程n Session 的 doWork(Work) 方法用于執(zhí)行 Work 對(duì)象指定的操作, 即調(diào)用 Work 對(duì)象的 execute() 方法. Session 會(huì)把當(dāng)前使用的數(shù)據(jù)庫(kù)連接傳遞給 execute() 方法.Hibernate 與觸發(fā)器協(xié)同工作n Hibernate 與數(shù)據(jù)庫(kù)中的觸發(fā)器協(xié)同工作時(shí),

41、 會(huì)造成兩類問(wèn)題觸發(fā)器使Session的緩存中的持久化對(duì)象與數(shù)據(jù)庫(kù)中對(duì)應(yīng)的數(shù)據(jù)不一致:觸發(fā)器運(yùn)行在數(shù)據(jù)庫(kù)中,它執(zhí)行的操作對(duì)Session是透明的Session的update()方法盲目地激發(fā)觸發(fā)器: 無(wú)論游離對(duì)象的屬性是否發(fā)生變化, 都會(huì)執(zhí)行update語(yǔ)句,而update語(yǔ)句會(huì)激發(fā)數(shù)據(jù)庫(kù)中相應(yīng)的觸發(fā)器n 解決方案: 在執(zhí)行完Session的相關(guān)操作后, 立即調(diào)用Session的flush()和refresh() 方法, 迫使Session 的緩存與數(shù)據(jù)庫(kù)同步(refresh() 方法重新從數(shù)據(jù)庫(kù)中加載對(duì)象)在映射文件的的 元素中設(shè)置 select-before-update 屬性: 當(dāng) Se

42、ssion 的 update 或 saveOrUpdate() 方法更新一個(gè)游離對(duì)象時(shí), 會(huì)先執(zhí)行 Select 語(yǔ)句, 獲得當(dāng)前游離對(duì)象在數(shù)據(jù)庫(kù)中的最新數(shù)據(jù), 只有在不一致的情況下才會(huì)執(zhí)行 update 語(yǔ)句內(nèi)存數(shù)據(jù)庫(kù)News 對(duì)象news 記錄flush()reflesh()Hibernate 的配置文件Hibernate配置文件概述 n Hibernate 配置文件主要用于配置數(shù)據(jù)庫(kù)連接和 Hibernate 運(yùn)行時(shí)所需的各種屬性n 每個(gè) Hibernate 配置文件對(duì)應(yīng)一個(gè) Configuration 對(duì)象n Hibernate配置文件可以有兩種格式:pert

43、ieshibernate.cfg.xml JDBC 連接屬性nJDBC 連接屬性connection.url:數(shù)據(jù)庫(kù)URL connection.username:數(shù)據(jù)庫(kù)用戶名connection.password:數(shù)據(jù)庫(kù)用戶密碼 connection.driver_class:數(shù)據(jù)庫(kù)JDBC驅(qū)動(dòng) dialect:配置數(shù)據(jù)庫(kù)的方言,根據(jù)底層的數(shù)據(jù)庫(kù)不同產(chǎn)生不同的 sql 語(yǔ)句,Hibernate 會(huì)針對(duì)數(shù)據(jù)庫(kù)的特性在訪問(wèn)時(shí)進(jìn)行優(yōu)化導(dǎo)入C3P0 jar包n 導(dǎo)入C3P0 jar包n 位置:hibernate-release-5.2.5.Finalliboptionalc3p0*.jarC3P0

44、數(shù)據(jù)庫(kù)連接池屬性n C3P0 數(shù)據(jù)庫(kù)連接池屬性hibernate.c3p0.max_size: 數(shù)據(jù)庫(kù)連接池的最大連接數(shù)hibernate.c3p0.min_size: 數(shù)據(jù)庫(kù)連接池的最小連接數(shù)hibernate.c3p0.timeout: 數(shù)據(jù)庫(kù)連接池中連接對(duì)象在多長(zhǎng)時(shí)間沒(méi)有使用過(guò)后,就應(yīng)該被銷毀hibernate.c3p0.max_statements: 緩存 Statement 對(duì)象的數(shù)量hibernate.c3p0.idle_test_period: 表示連接池檢測(cè)線程檢測(cè)線程多長(zhǎng)時(shí)間檢測(cè)一次池內(nèi)的所有鏈接對(duì)象是否超時(shí). 連接池本身不會(huì)把自己從連接池中移除,而是專門有一個(gè)線程按照一定的

45、時(shí)間間隔來(lái)做這件事,這個(gè)線程通過(guò)比較連接對(duì)象最后一次被使用時(shí)間和當(dāng)前時(shí)間的時(shí)間差來(lái)和 timeout 做對(duì)比,進(jìn)而決定是否銷毀這個(gè)連接對(duì)象。 hibernate.c3p0.acquire_increment: 當(dāng)數(shù)據(jù)庫(kù)連接池中的連接耗盡時(shí), 同一時(shí)刻獲取多少個(gè)數(shù)據(jù)庫(kù)連接hibernate.cfg.xml的常用屬性n 其他show_sql:是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試。取值 true | false format_sql:是否將 SQL 轉(zhuǎn)化為格式良好的 SQL . 取值 true | falsehbm2ddl.auto:在啟動(dòng)和停止時(shí)自動(dòng)地創(chuàng)建,更新或刪除數(shù)據(jù)庫(kù)模式。取值 cre

46、ate | update | create-drop | validatehibernate.jdbc.fetch_sizehibernate.jdbc.batch_sizejdbc.fetch_sizejdbc.fetch_size 和和 jdbc.batch_sizejdbc.batch_sizen hibernate.jdbc.fetch_size:實(shí)質(zhì)是調(diào)用 Statement.setFetchSize() 方法設(shè)定設(shè)定 JDBC JDBC 的的 Statement Statement 讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù)錄條數(shù)。例如一次查詢1

47、萬(wàn)條記錄,對(duì)于Oracle的JDBC驅(qū)動(dòng)來(lái)說(shuō),是不會(huì) 1 次性把1萬(wàn)條取出來(lái)的,而只會(huì)取出 fetchSize 條數(shù),當(dāng)結(jié)果集遍歷完了這些記錄以后,再去數(shù)據(jù)庫(kù)取 fetchSize 條數(shù)據(jù)。因此大大節(jié)省了無(wú)謂的內(nèi)存消耗。Fetch Size設(shè)的越大,讀數(shù)據(jù)庫(kù)的次數(shù)越少,速度越快;Fetch Size越小,讀數(shù)據(jù)庫(kù)的次數(shù)越多,速度越慢。Oracle數(shù)據(jù)庫(kù)的JDBC驅(qū)動(dòng)默認(rèn)的Fetch Size = 10,是一個(gè)保守的設(shè)定,根據(jù)測(cè)試,當(dāng)Fetch Size=50時(shí),性能會(huì)提升1倍之多,當(dāng) fetchSizeetchSize=100=100,性能還能繼續(xù)提升20%,F(xiàn)etch Size繼續(xù)增大,性能

48、提升的就不顯著了。并不是所有的數(shù)據(jù)庫(kù)都支持Fetch Size特性,例如MySQL就不支持n hibernate.jdbc.batch_size:設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小批量插入的時(shí)候的批次大小,類似于設(shè)置緩沖區(qū)大小的意思。batchSize 越大,批量操作時(shí)向數(shù)據(jù)庫(kù)發(fā)送sql的次數(shù)越少,速度就越快。測(cè)試結(jié)果是當(dāng)Batch Size=0的時(shí)候,使用Hibernate對(duì)Oracle數(shù)據(jù)庫(kù)刪除1萬(wàn)條記錄需要25秒,Batch Size = 50的時(shí)候,刪除僅僅需要5秒!Oracle數(shù)據(jù)庫(kù) batchSizeatchSize=3

49、0=30 的時(shí)候比較合適。對(duì)象關(guān)系映射文件POJO 類和數(shù)據(jù)庫(kù)的映射文件*.hbm.xmln POJO 類和關(guān)系數(shù)據(jù)庫(kù)之間的映射可以用一個(gè)XML文檔來(lái)定義。n 通過(guò) POJO 類的數(shù)據(jù)庫(kù)映射文件,Hibernate可以理解持久化類和數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系,也可以理解持久化類屬性與數(shù)據(jù)庫(kù)表列之間的對(duì)應(yīng)關(guān)系n 在運(yùn)行時(shí) Hibernate 將根據(jù)這個(gè)映射文件來(lái)生成各種 SQL 語(yǔ)句n 映射文件的擴(kuò)展名為 .hbm.xmlHiberrnate-mapping映射文件說(shuō)明n hibernate-mapping類層次:class主鍵:id基本類型:property實(shí)體引用類: many-to-one |

50、one-to-one集合:set | list | map | arrayone-to-manymany-to-many子類:subclass | joined-subclass其它:component | any 等查詢語(yǔ)句:query(用來(lái)放置查詢語(yǔ)句,便于對(duì)數(shù)據(jù)庫(kù)查詢的統(tǒng)一管理和優(yōu)化)n 每個(gè)Hibernate-mapping中可以同時(shí)定義多個(gè)類. 但更推薦為每個(gè)類都創(chuàng)建一個(gè)單獨(dú)的映射文件hibernate-mapping hibernate-mapping 是是 hibernate 映射文件的根映射文件的根元素元素schema: 指定所映射的數(shù)據(jù)庫(kù)指定所映射的數(shù)據(jù)庫(kù)schema的名稱。

51、若指定該屬的名稱。若指定該屬性性, 則表明會(huì)自動(dòng)添加該則表明會(huì)自動(dòng)添加該 schema 前綴前綴catalog:指定所映射的數(shù)據(jù)庫(kù)指定所映射的數(shù)據(jù)庫(kù)catalog的名稱。的名稱。 default-cascade(默認(rèn)為默認(rèn)為 none): 設(shè)置設(shè)置hibernate默認(rèn)的默認(rèn)的級(jí)聯(lián)風(fēng)格級(jí)聯(lián)風(fēng)格. 若配置若配置 Java 屬性屬性, 集合映射時(shí)沒(méi)有指定集合映射時(shí)沒(méi)有指定 cascade 屬性屬性, 則則 Hibernate 將采用此處指定的級(jí)聯(lián)風(fēng)格將采用此處指定的級(jí)聯(lián)風(fēng)格. default-access (默認(rèn)為默認(rèn)為 property): 指定指定 Hibernate 的默認(rèn)的屬性訪問(wèn)策略。默

52、認(rèn)值為的默認(rèn)的屬性訪問(wèn)策略。默認(rèn)值為 property, 即使用即使用 getter, setter 方法來(lái)訪問(wèn)屬性方法來(lái)訪問(wèn)屬性. 若指定若指定 access, 則則 Hibernate 會(huì)忽略會(huì)忽略 getter/setter 方法方法, 而通過(guò)反射訪而通過(guò)反射訪問(wèn)成員變量問(wèn)成員變量.default-lazy(默認(rèn)為默認(rèn)為 true): 設(shè)置設(shè)置 Hibernat morning的延遲加載策略的延遲加載策略. 該屬性的默認(rèn)值為該屬性的默認(rèn)值為 true, 即啟用延遲加即啟用延遲加載策略載策略. 若配置若配置 Java 屬性映射屬性映射, 集合映射時(shí)沒(méi)有指定集合映射時(shí)沒(méi)有指定 lazy 屬性

53、屬性, 則則 Hibernate 將采用此處指定的延遲加載策將采用此處指定的延遲加載策略略 auto-import (默認(rèn)為默認(rèn)為 true): 指定是否可以在查詢語(yǔ)言中指定是否可以在查詢語(yǔ)言中使用非全限定的類名(僅限于本映射文件中的類)。使用非全限定的類名(僅限于本映射文件中的類)。 package (可選可選): 指定一個(gè)包前綴,如果在映射文檔中沒(méi)有指定一個(gè)包前綴,如果在映射文檔中沒(méi)有指定全限定的類名,指定全限定的類名, 就使用這個(gè)作為包名。就使用這個(gè)作為包名。 詳細(xì)取值參看:詳細(xì)取值參看:http:/ class 元素用于指定類和表的映射元素用于指定類和表的映射name:指定該持久化類映

54、射的持久化類的類名指定該持久化類映射的持久化類的類名table:指定該持久化類映射的表名指定該持久化類映射的表名, Hibernate 默認(rèn)默認(rèn)以持久化類的類名作為表名以持久化類的類名作為表名dynamic-insert: 若設(shè)置為若設(shè)置為 true, 表示當(dāng)保存一個(gè)表示當(dāng)保存一個(gè)對(duì)象時(shí)對(duì)象時(shí), 會(huì)動(dòng)態(tài)生成會(huì)動(dòng)態(tài)生成 insert 語(yǔ)句語(yǔ)句, insert 語(yǔ)句中語(yǔ)句中僅包含所有取值不為僅包含所有取值不為 null 的字段的字段. 默認(rèn)值為默認(rèn)值為 falsedynamic-update: 若設(shè)置為若設(shè)置為 true, 表示當(dāng)更新一個(gè)表示當(dāng)更新一個(gè)對(duì)象時(shí)對(duì)象時(shí), 會(huì)動(dòng)態(tài)生成會(huì)動(dòng)態(tài)生成 upda

55、te 語(yǔ)句語(yǔ)句, update 語(yǔ)句中語(yǔ)句中僅包含所有取值需要更新的字段僅包含所有取值需要更新的字段. 默認(rèn)值為默認(rèn)值為 falseselect-before-update:設(shè)置設(shè)置 Hibernate 在更新某在更新某個(gè)持久化對(duì)象之前是否需要先執(zhí)行一次查詢個(gè)持久化對(duì)象之前是否需要先執(zhí)行一次查詢. 默認(rèn)值默認(rèn)值為為 falsebatch-size:指定根據(jù)指定根據(jù) OID 來(lái)抓取實(shí)例時(shí)每批抓取的來(lái)抓取實(shí)例時(shí)每批抓取的實(shí)例數(shù)實(shí)例數(shù).lazy: 指定是否使用延遲加載指定是否使用延遲加載. mutable: 若設(shè)置為若設(shè)置為 true, 等價(jià)于所有的等價(jià)于所有的 元素的元素的 update 屬性為屬

56、性為 false, 表示整表示整個(gè)實(shí)例不能被更新個(gè)實(shí)例不能被更新. 默認(rèn)為默認(rèn)為 true. discriminator-value: 指定區(qū)分不同子類的值指定區(qū)分不同子類的值. 當(dāng)當(dāng)使用使用 元素來(lái)定義持久化類的繼承關(guān)系元素來(lái)定義持久化類的繼承關(guān)系時(shí)需要使用該屬性時(shí)需要使用該屬性詳細(xì)取值參看:詳細(xì)取值參看:http:/ Hibernate 使用對(duì)象標(biāo)識(shí)符(OID) 來(lái)建立內(nèi)存中的對(duì)象和數(shù)據(jù)庫(kù)表中記錄的對(duì)應(yīng)關(guān)系. 對(duì)象的 OID 和數(shù)據(jù)表的主鍵對(duì)應(yīng). Hibernate 通過(guò)標(biāo)識(shí)符生成器來(lái)為主鍵賦值n Hibernate 推薦在數(shù)據(jù)表中使用代理主鍵, 即不具備業(yè)務(wù)含義的字段. 代理主鍵通常為整

57、數(shù)類型, 因?yàn)檎麛?shù)類型比字符串類型要節(jié)省更多的數(shù)據(jù)庫(kù)空間.n 在對(duì)象-關(guān)系映射文件中, 元素用來(lái)設(shè)置對(duì)象標(biāo)識(shí)符. 子元素用來(lái)設(shè)定標(biāo)識(shí)符生成器.n Hibernate 提供了標(biāo)識(shí)符生成器接口: IdentifierGenerator, 并提供了各種內(nèi)置實(shí)現(xiàn)id id:設(shè)定持久化類的:設(shè)定持久化類的 OID 和表的主鍵的映射和表的主鍵的映射 name: 標(biāo)識(shí)持久化類標(biāo)識(shí)持久化類 OID 的屬性名的屬性名 column: 設(shè)置標(biāo)識(shí)屬性所映射的數(shù)據(jù)表的列名設(shè)置標(biāo)識(shí)屬性所映射的數(shù)據(jù)表的列名(主鍵字段主鍵字段的名字的名字). unsaved-value:若設(shè)定了該屬性若設(shè)定了該屬性, Hibernate

58、會(huì)通過(guò)會(huì)通過(guò)比較持久化類的比較持久化類的 OID 值和該屬性值來(lái)區(qū)分當(dāng)前持久化類值和該屬性值來(lái)區(qū)分當(dāng)前持久化類的對(duì)象是否為臨時(shí)對(duì)象的對(duì)象是否為臨時(shí)對(duì)象 type:指定指定 Hibernate 映射類型映射類型. Hibernate 映射類映射類型是型是 Java 類型與類型與 SQL 類型的橋梁類型的橋梁. 如果沒(méi)有為某個(gè)如果沒(méi)有為某個(gè)屬性顯式設(shè)定映射類型屬性顯式設(shè)定映射類型, Hibernate 會(huì)運(yùn)用反射機(jī)制先會(huì)運(yùn)用反射機(jī)制先識(shí)別出持久化類的特定屬性的識(shí)別出持久化類的特定屬性的 Java 類型類型, 然后自動(dòng)使然后自動(dòng)使用與之對(duì)應(yīng)的默認(rèn)的用與之對(duì)應(yīng)的默認(rèn)的 Hibernate 映射類型映射

59、類型 Java 的基本數(shù)據(jù)類型和包裝類型對(duì)應(yīng)相同的的基本數(shù)據(jù)類型和包裝類型對(duì)應(yīng)相同的 Hibernate 映射類型映射類型. 基本數(shù)據(jù)類型無(wú)法表達(dá)基本數(shù)據(jù)類型無(wú)法表達(dá) null, 所以對(duì)于持久化類的所以對(duì)于持久化類的 OID 推薦使用包裝類型推薦使用包裝類型saveOrUpdate詳細(xì)取值參看:詳細(xì)取值參看:http:/ generatorgenerator:設(shè)定持久化類設(shè)定標(biāo)識(shí)符生成器:設(shè)定持久化類設(shè)定標(biāo)識(shí)符生成器 class: class: 指定使用的標(biāo)識(shí)符生成器全限定類名或其縮寫(xiě)名指定使用的標(biāo)識(shí)符生成器全限定類名或其縮寫(xiě)名詳細(xì)取值參看:詳細(xì)取值參看:http:/ Hibernate提供的

60、內(nèi)置標(biāo)識(shí)符生成器: 詳細(xì)取值參看:詳細(xì)取值參看:http:/ 標(biāo)識(shí)符生成器n increment 標(biāo)識(shí)符生成器由由 Hibernate 以遞增的方式為代理主鍵賦值n Hibernate 會(huì)先讀取 NEWS 表中的主鍵的最大值, 而接下來(lái)向 NEWS 表中插入記錄時(shí), 就在 max(id) 的基礎(chǔ)上遞增, 增量為 1.n 適用范圍:由于 increment 生存標(biāo)識(shí)符機(jī)制不依賴于底層數(shù)據(jù)庫(kù)系統(tǒng), 因此它適合所有的數(shù)據(jù)庫(kù)系統(tǒng)適用于只有單個(gè) Hibernate 應(yīng)用進(jìn)程應(yīng)用進(jìn)程訪問(wèn)同一個(gè)數(shù)據(jù)庫(kù)的場(chǎng)合, 在集群環(huán)境下不推薦使用它OID 必須為 long, int 或 short 類型, 如果把 OID

溫馨提示

  • 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)論