尚硅谷_佟剛_Hibernate_第1頁
尚硅谷_佟剛_Hibernate_第2頁
尚硅谷_佟剛_Hibernate_第3頁
尚硅谷_佟剛_Hibernate_第4頁
尚硅谷_佟剛_Hibernate_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

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

2、需對(duì)象,需要為每一個(gè)對(duì)象分配一個(gè)唯一的標(biāo)識(shí)號(hào)。在關(guān)系數(shù)據(jù)庫中稱之為主鍵,而在對(duì)象術(shù)語中,則叫做對(duì)象標(biāo)識(shí)在關(guān)系數(shù)據(jù)庫中稱之為主鍵,而在對(duì)象術(shù)語中,則叫做對(duì)象標(biāo)識(shí)(Object (Object identifier-OID). identifier-OID). ORM ORM(Object/Relation MappingMapping): 對(duì)象對(duì)象/ /關(guān)系關(guān)系映射映射 ORM 主要解決對(duì)象-關(guān)系的映射 ORM的思想:將關(guān)系數(shù)據(jù)庫中表中的記錄映射成為對(duì)象,以對(duì)象的形式展現(xiàn),程序員可以把對(duì)數(shù)據(jù)庫的操作轉(zhuǎn)化為對(duì)對(duì)象的操作程序員可以把對(duì)數(shù)據(jù)庫的操作轉(zhuǎn)化為對(duì)對(duì)象的操作。 ORM 采用元數(shù)據(jù)元數(shù)據(jù)來描述對(duì)

3、象-關(guān)系映射細(xì)節(jié), 元數(shù)據(jù)通常采用 XML 格式, 并且存放在專門的對(duì)象-關(guān)系映射文件中.ORM流行的ORM框架 Hibernate:Hibernate: 非常優(yōu)秀、成熟的 ORM 框架。 完成對(duì)象的持久化操作 Hibernate 允許開發(fā)者采用面向?qū)ο蟮姆绞讲捎妹嫦驅(qū)ο蟮姆绞絹聿僮麝P(guān)系數(shù)據(jù)庫。 消除那些針對(duì)特定數(shù)據(jù)庫廠商的 SQL 代碼 myBatis: 相比 Hibernate 靈活高,運(yùn)行速度快 開發(fā)速度慢,不支持純粹的面向?qū)ο蟛僮?,需熟悉sql語 句,并且熟練使用sql語句優(yōu)化功能 TopLink OJBHibernate 與 Jdbc 代碼對(duì)比Hibernate 實(shí)現(xiàn)JDBC 實(shí)現(xiàn)安

4、裝 hibernate 插件安裝方法說明(hibernatetools-4.1.1.Final):HelpHelp - Install New Software.Install New Software.Click Add. In dialog Add Site dialog, click Archive. Archive. Navigate to hibernatetools-Update-4.1.1.Final_2013-12-08_01-hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip06-33-B605.zip

5、 and click Open Open Clicking OKOK in the Add Site dialog will bring you back to the dialog Install Select the JbossJboss Tools Tools hibernatetoolshibernatetools Nightly Build Update Nightly Build Update SiteSite that has appeared Click NextNext and then FinishFinish Approve the license Approve the

6、 license Restart eclipse when that is asked準(zhǔn)備 Hibernate 環(huán)境 導(dǎo)入 Hibernate 必須的 jar 包: 加入數(shù)據(jù)庫驅(qū)動(dòng)的 jar 包: Hibernate開發(fā)步驟hibernate.cfg.xml *.hbm.xml2. 2. 創(chuàng)建持久化類創(chuàng)建持久化類3. 3. 創(chuàng)建對(duì)象創(chuàng)建對(duì)象- -關(guān)系映射文件關(guān)系映射文件4. 4. 通過通過 Hibernate API Hibernate API 編寫訪編寫訪問數(shù)據(jù)庫的代碼問數(shù)據(jù)庫的代碼1. 1. 創(chuàng)建創(chuàng)建 Hibernate Hibernate 配置文件配置文件1. 創(chuàng)建持久化 Java 類提

7、供一個(gè)無參的構(gòu)造器提供一個(gè)無參的構(gòu)造器:使Hibernate可以使用Constructor.newInstance() 來實(shí)例化持久化類提供一個(gè)標(biāo)識(shí)屬性提供一個(gè)標(biāo)識(shí)屬性(identifier property)(identifier property): 通常映射為數(shù)據(jù)庫表的主鍵字段. 如果沒有該屬性,一些功能將不起作用,如:Session.saveOrUpdate()為類的持久化類字段聲明訪問方法為類的持久化類字段聲明訪問方法(get/set): Hibernate對(duì)JavaBeans 風(fēng)格的屬性實(shí)行持久化。使用非使用非 final final 類類: 在運(yùn)行時(shí)生成代理是 Hibernate

8、 的一個(gè)重要的功能. 如果持久化類沒有實(shí)現(xiàn)任何接口, Hibnernate 使用 CGLIB 生成代理. 如果使用的是 final 類, 則無法生成 CGLIB 代理.重寫重寫 eqaulseqauls 和和 hashCodehashCode 方法方法: 如果需要把持久化類的實(shí)例放到 Set 中(當(dāng)需要進(jìn)行關(guān)聯(lián)映射時(shí)), 則應(yīng)該重寫這兩個(gè)方法1. 創(chuàng)建持久化 Java 類 Hibernate 不要求持久化類繼承任何父類或?qū)崿F(xiàn)接口,這可以保證代碼不被污染。這就是Hibernate被稱為低侵入式設(shè)計(jì)的原因2. 創(chuàng)建對(duì)象-關(guān)系映射文件Hibernate 采用 XML 格式的文件來指定對(duì)象和關(guān)系數(shù)據(jù)之

9、間的映射. 在運(yùn)行時(shí) Hibernate 將根據(jù)這個(gè)映射文件來生成各種 SQL 語句映射文件的擴(kuò)展名為 .hbm.xml指定類和表的映射指定持久化類的OID 和表的主鍵的映射映射類的屬性和表的字段指定對(duì)象標(biāo)識(shí)符生成器, 負(fù)責(zé)為 OID 生成唯一標(biāo)識(shí)符3. 創(chuàng)建 Hibernate 配置文件 Hibernate 從其配置文件中讀取和數(shù)據(jù)庫連接的有關(guān)信息, 這個(gè)文件應(yīng)該位于應(yīng)用的 classpath 下.指定連接數(shù)據(jù)庫的基本屬性信息指定數(shù)據(jù)庫所使用的 SQL 方言指定程序運(yùn)行時(shí)是否在控制臺(tái)輸出 SQL 語句指定程序運(yùn)行時(shí)是否在數(shù)據(jù)庫自動(dòng)生成數(shù)據(jù)表指定程序需要關(guān)聯(lián)的映射文件指定是否對(duì)輸出 SQL 語

10、句進(jìn)行格式化4. 通過 Hibernate API 編寫訪問數(shù)據(jù)庫的代碼 測試代碼 下邊是控制臺(tái)輸出的 SQL 語句Helloworld 使用 Hibernate 進(jìn)行數(shù)據(jù)持久化操作,通常有如下步驟: 編寫持久化類: POJO + 映射文件 獲取 Configuration 對(duì)象 獲取 SessionFactory 對(duì)象 獲取 Session,打開事務(wù) 用面向?qū)ο蟮姆绞讲僮鲾?shù)據(jù)庫 關(guān)閉事務(wù),關(guān)閉 SessionConfiguration 類 Configuration 類負(fù)責(zé)管理 Hibernate 的配置信息。包括如下內(nèi)容: Hibernate 運(yùn)行的底層信息:數(shù)據(jù)庫的URL、用戶名、密碼、

11、JDBC驅(qū)動(dòng)類,數(shù)據(jù)庫Dialect,數(shù)據(jù)庫連接池等(對(duì)應(yīng) hibernate.cfg.xmlhibernate.cfg.xml 文件)。 持久化類與數(shù)據(jù)表的映射關(guān)系(*.hbm.xmlhbm.xml 文件) 創(chuàng)建 Configuration 的兩種方式 屬性文件(pertiesproperties): Configuration Configuration cfgcfg = new Configuration(); = new Configuration(); Xml文件(hibernate.cfg.xmlxml) Configuration Configurati

12、on cfgcfg = new Configuration().configure(); = new Configuration().configure(); Configuration 的 configure 方法還支持帶參數(shù)的訪問: File File filefile = new File(“simpleit.xml”); = new File(“simpleit.xml”); Configuration Configuration cfgcfg = new Configuration().configure(file); = new Configuration().configure(

13、file); SessionFactory 接口針對(duì)單個(gè)數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像,是線程安全的。 SessionFactory 對(duì)象一旦構(gòu)造完畢,即被賦予特定的配置信息SessionFactory是生成Session的工廠構(gòu)造 SessionFactory 很消耗資源,一般情況下一個(gè)應(yīng)用中只初始化一個(gè) SessionFactory 對(duì)象。Hibernate4 新增了一個(gè) ServiceRegistry 接口,所有基于 Hibernate 的配置或者服務(wù)都必須統(tǒng)一向這個(gè) ServiceRegistry 注冊后才能生效Hibernate4 中創(chuàng)建 SessionFactory 的步驟Se

14、ssion 接口Session 是應(yīng)用程序與數(shù)據(jù)庫之間交互操作的一個(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 JDBC 中的中的 ConnectionConnection。Session 接口 持久化類與 Session 關(guān)聯(lián)起來后就具有了持久化的能力。 Session 類的方法: 取得持久化對(duì)象的方法: get() load() 持久化對(duì)象都得保

15、存,更新和刪除:save(),update(),saveOrUpdate(),delete() 開啟事務(wù): beginTransaction(). 管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等Transaction(事務(wù)) 代表一次原子操作,它具有數(shù)據(jù)庫事務(wù)的概念。所有持久層都應(yīng)該在事務(wù)管理下進(jìn)行,即使是只讀操作。 Transaction Transaction tx tx = = session.beginTransactionsession.beginTransaction();(); 常用方法: commit():

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

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

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

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

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

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

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

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

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

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

26、的角度, Hibernate , Hibernate 把對(duì)象分為把對(duì)象分為 4 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) 臨時(shí)對(duì)象(Transient): 在使用代理主鍵的情況下, OID OID 通常為通常為 nullnull 不處于不處于 Session Session 的緩存中的緩存中 在數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄在數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄 持久化對(duì)象(也叫”托管”)(Persist): OID OID 不為不為 nullnull 位于位于 Session Session 緩存中緩存中

27、 若在數(shù)據(jù)庫中已經(jīng)有和其對(duì)應(yīng)的記錄, 持久化對(duì)象和數(shù)據(jù)庫中的相關(guān)持久化對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄對(duì)應(yīng)記錄對(duì)應(yīng) Session Session 在在 flush flush 緩存時(shí)緩存時(shí), , 會(huì)根據(jù)持久化對(duì)象的屬性變化會(huì)根據(jù)持久化對(duì)象的屬性變化, , 來同步更新來同步更新數(shù)據(jù)庫數(shù)據(jù)庫 在同一個(gè)在同一個(gè) Session Session 實(shí)例的緩存中實(shí)例的緩存中, , 數(shù)據(jù)庫表中的每條記錄只對(duì)應(yīng)唯一數(shù)據(jù)庫表中的每條記錄只對(duì)應(yīng)唯一的持久化對(duì)象的持久化對(duì)象持久化對(duì)象的狀態(tài) 刪除對(duì)象(Removed) 在數(shù)據(jù)庫中沒有和其 OID 對(duì)應(yīng)的記錄 不再處于 Session 緩存中 一般情況下, 應(yīng)用程序不該再使

28、用被刪除的對(duì)象 游離對(duì)象(也叫”脫管”) (Detached): OID OID 不為不為 nullnull 不再處于不再處于 Session Session 緩存中緩存中 一般情況需下, 游離對(duì)象是由持久化對(duì)象轉(zhuǎn)變過來的, 因此在數(shù)據(jù)庫中可能還存在與它對(duì)應(yīng)的記錄對(duì)象的狀態(tài)轉(zhuǎn)換圖臨時(shí)狀態(tài)持久化狀態(tài)游離狀態(tài)刪除狀態(tài)new 語句get()Load()Query.list()Query.uniqueResult()Query.iterator()Query.scoll()save()saveOrUpdate()persist()merge()evict()close()clear()update()

29、saveOrUpdate()merge()delete()delete()垃圾回收垃圾回收垃圾回收1. 是否在 Session 緩存中2. 在數(shù)據(jù)表中是否有對(duì)應(yīng)的記錄Session 的 save() 方法 Session 的 save() 方法使一個(gè)臨時(shí)對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象 Session 的 save() 方法完成以下操作: 把把 News News 對(duì)象加入到對(duì)象加入到 Session Session 緩存中緩存中, , 使它進(jìn)入持久化狀態(tài)使它進(jìn)入持久化狀態(tài) 選用映射文件指定的標(biāo)識(shí)符生成器選用映射文件指定的標(biāo)識(shí)符生成器, , 為持久化對(duì)象分配唯一的為持久化對(duì)象分配唯一的 OIDOID. 在

30、 使用代理主鍵的情況下, setId() 方法為 News 對(duì)象設(shè)置 OID 使無效的. 計(jì)劃執(zhí)行一條計(jì)劃執(zhí)行一條 insert insert 語句:在語句:在 flush flush 緩存的時(shí)候緩存的時(shí)候 Hibernate 通過持久化對(duì)象的 OID 來維持它和數(shù)據(jù)庫相關(guān)記錄的對(duì)應(yīng)關(guān)系. 當(dāng) News 對(duì)象處于持久化狀態(tài)時(shí), 不允許程序不允許程序隨意修改它的隨意修改它的 IDID persist() persist() 和和 save() save() 區(qū)別區(qū)別: 當(dāng)對(duì)一個(gè) OID 不為 Null 的對(duì)象執(zhí)行 save() 方法時(shí), 會(huì)把該對(duì)象以一個(gè)新的 oid 保存到數(shù)據(jù)庫中; 但執(zhí)行 p

31、ersist() 方法時(shí)會(huì)拋出一個(gè)異常.Session 的 get() 和 load() 方法 都可以根據(jù)跟定的 OID 從數(shù)據(jù)庫中加載一個(gè)持久化對(duì)象 區(qū)別: 當(dāng)數(shù)據(jù)庫中不存在與 OID 對(duì)應(yīng)的記錄時(shí), load() 方法拋出 ObjectNotFoundException 異常, 而 get() 方法返回 null 兩者采用不同的延遲檢索策略:延遲檢索策略:load load 方法支持延遲加載策方法支持延遲加載策略。而略。而 get get 不支持。不支持。Session 的 update() 方法 Session 的 update() 方法使一個(gè)游離對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象, 并且計(jì)劃執(zhí)行一條

32、 update 語句. 若希望 Session 僅當(dāng)修改了 News 對(duì)象的屬性時(shí), 才執(zhí)行 update() 語句, 可以把映射文件中 元素的 select-select-before-updatebefore-update 設(shè)為 true. 該屬性的默認(rèn)值為 false 當(dāng)當(dāng) update() update() 方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí)方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí), , 如果在如果在 Session Session 的緩的緩存中已經(jīng)存在相同存中已經(jīng)存在相同 OID OID 的持久化對(duì)象的持久化對(duì)象, , 會(huì)拋出異常會(huì)拋出異常 當(dāng) update() 方法關(guān)聯(lián)一個(gè)游離對(duì)象時(shí), 如果在數(shù)據(jù)庫中不存在相應(yīng)

33、的記錄, 也會(huì)拋出異常. Session 的 saveOrUpdate() 方法 Session 的 saveOrUpdate() 方法同時(shí)包含了 save() 與 update() 方法的功能News 對(duì)象游離對(duì)象臨時(shí)對(duì)象update()save()判定對(duì)象為臨時(shí)對(duì)象的標(biāo)準(zhǔn) Java Java 對(duì)象的對(duì)象的 OID OID 為為 nullnull 映射文件中為 設(shè)置了 unsaved-value unsaved-value 屬性, 并且 Java 對(duì)象的 OID 取值與這個(gè) unsaved-value 屬性值匹配Session 的 merge() 方法news1 的狀態(tài)Session緩存中是

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

35、從 Session 緩存中刪除, 該對(duì)象進(jìn)入刪除狀態(tài). Hibernate 的 cfg.xml 配置文件中有一個(gè) hibernate.use_identifier_rollbackhibernate.use_identifier_rollback 屬性, 其默認(rèn)值為 false, 若把它設(shè)為 true, 將改變 delete() 方法的運(yùn)行行為: delete() 方法會(huì)把持久化對(duì)象或游離對(duì)象的 OID 設(shè)置為 null, 使它們變?yōu)榕R時(shí)對(duì)象通過 Hibernate 調(diào)用存儲(chǔ)過程 Work 接口: 直接通過 JDBC API 來訪問數(shù)據(jù)庫的操作 Session 的 doWork(Work) 方

36、法用于執(zhí)行 Work 對(duì)象指定的操作, 即調(diào)用 Work 對(duì)象的 execute() 方法. Session 會(huì)把當(dāng)前使用的數(shù)據(jù)庫連接傳遞給 execute() 方法.Hibernate 與觸發(fā)器協(xié)同工作Hibernate 與數(shù)據(jù)庫中的觸發(fā)器協(xié)同工作時(shí), 會(huì)造成兩類問題 觸發(fā)器使 Session 的緩存中的持久化對(duì)象與數(shù)據(jù)庫中對(duì)應(yīng)的數(shù)據(jù)不一致:觸發(fā)器運(yùn)行在數(shù)據(jù)庫中, 它執(zhí)行的操作對(duì) Session 是透明的 Session 的 update() 方法盲目地激發(fā)觸發(fā)器: 無論游離對(duì)象的屬性是否發(fā)生變化, 都會(huì)執(zhí)行 update 語句, 而 update 語句會(huì)激發(fā)數(shù)據(jù)庫中相應(yīng)的觸發(fā)器解決方案:

37、在執(zhí)行完 Session 的相關(guān)操作后, 立即調(diào)用 Session 的 flush() 和 refresh() 方法, 迫使 Session 的緩存與數(shù)據(jù)庫同步(refresh() 方法重新從數(shù)據(jù)庫中加載對(duì)象) 在映射文件的的 元素中設(shè)置 select-before-update 屬性: 當(dāng) Session 的 update 或 saveOrUpdate() 方法更新一個(gè)游離對(duì)象時(shí), 會(huì)先執(zhí)行 Select 語句, 獲得當(dāng)前游離對(duì)象在數(shù)據(jù)庫中的最新數(shù)據(jù), 只有在不一致的情況下才會(huì)執(zhí)行 update 語句內(nèi)存數(shù)據(jù)庫News 對(duì)象news 記錄flush()reflesh()Hibernate 的

38、配置文件HibernateHibernate配置文件配置文件 Hibernate 配置文件主要用于配置數(shù)據(jù)庫連接和 Hibernate 運(yùn)行時(shí)所需的各種屬性 每個(gè) Hibernate 配置文件對(duì)應(yīng)一個(gè) Configuration 對(duì)象 Hibernate配置文件可以有兩種格式: perties hibernate.cfg.xmlhibernate.cfg.xml hibernate.cfg.xml的常用屬性 JDBC 連接屬性 connection.url:數(shù)據(jù)庫URL connection.username:數(shù)據(jù)庫用戶名 connection.password:數(shù)據(jù)

39、庫用戶密碼 connection.driver_class:數(shù)據(jù)庫JDBC驅(qū)動(dòng) dialectdialect:配置數(shù)據(jù)庫的方言,根據(jù)底層的數(shù)據(jù)庫不同產(chǎn)生不同的 sql 語句,Hibernate 會(huì)針對(duì)數(shù)據(jù)庫的特性在訪問時(shí)進(jìn)行優(yōu)化hibernate.cfg.xml的常用屬性 C3P0 數(shù)據(jù)庫連接池屬性 hibernate.c3p0.max_size: 數(shù)據(jù)庫連接池的最大連接數(shù) hibernate.c3p0.min_size: 數(shù)據(jù)庫連接池的最小連接數(shù) hibernate.c3p0.timeout: 數(shù)據(jù)庫連接池中連接對(duì)象在多長時(shí)間沒有使用過后,就應(yīng)該被銷毀 hibernate.c3p0.max_

40、statements: 緩存 Statement 對(duì)象的數(shù)量 hibernate.c3p0.idle_test_period: 表示連接池檢測線程檢測線程多長時(shí)間檢測一次池內(nèi)的所有鏈接對(duì)象是否超時(shí). 連接池本身不會(huì)把自己從連接池中移除,而是專門有一個(gè)線程按照一定的時(shí)間間隔來做這件事,這個(gè)線程通過比較連接對(duì)象最后一次被使用時(shí)間和當(dāng)前時(shí)間的時(shí)間差來和 timeout 做對(duì)比,進(jìn)而決定是否銷毀這個(gè)連接對(duì)象。 hibernate.c3p0.acquire_increment: 當(dāng)數(shù)據(jù)庫連接池中的連接耗盡時(shí), 同一時(shí)刻獲取多少個(gè)數(shù)據(jù)庫連接hibernate.cfg.xml的常用屬性 其他 show_sq

41、l:是否將運(yùn)行期生成的SQL輸出到日志以供調(diào)試。取值 true | false format_sql:是否將 SQL 轉(zhuǎn)化為格式良好的 SQL . 取值 true | false hbm2ddl.auto:在啟動(dòng)和停止時(shí)自動(dòng)地創(chuàng)建,更新或刪除數(shù)據(jù)庫模式。取值 create | update | create-drop | validate hibernate.jdbc.fetch_size hibernate.jdbc.batch_sizejdbc.fetch_sizejdbc.fetch_size 和和 jdbc.batch_sizejdbc.batch_sizehibernate.jdbc

42、.fetch_size:實(shí)質(zhì)是調(diào)用 Statement.setFetchSize() 方法設(shè)設(shè)定定 JDBC JDBC 的的 Statement Statement 讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫中取出的記錄條數(shù)讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫中取出的記錄條數(shù)。 例如一次查詢1萬條記錄,對(duì)于Oracle的JDBC驅(qū)動(dòng)來說,是不會(huì) 1 次性把1萬條取出來的,而只會(huì)取出 fetchSize 條數(shù),當(dāng)結(jié)果集遍歷完了這些記錄以后,再去數(shù)據(jù)庫取 fetchSize 條數(shù)據(jù)。因此大大節(jié)省了無謂的內(nèi)存消耗。Fetch Size設(shè)的越大,讀數(shù)據(jù)庫的次數(shù)越少,速度越快;Fetch Size越小,讀數(shù)據(jù)庫的次數(shù)越多,速度越

43、慢。Oracle數(shù)據(jù)庫的JDBC驅(qū)動(dòng)默認(rèn)的Fetch Size = 10,是一個(gè)保守的設(shè)定,根據(jù)測試,當(dāng)Fetch Size=50時(shí),性能會(huì)提升1倍之多,當(dāng) fetchSizeetchSize=100=100,性能還能繼續(xù)提升20%,F(xiàn)etch Size繼續(xù)增大,性能提升的就不顯著了。并不是所有的數(shù)據(jù)庫都支持Fetch Size特性,例如MySQL就不支持hibernate.jdbc.batch_size:設(shè)定對(duì)數(shù)據(jù)庫進(jìn)行批量刪除,批量更新和批設(shè)定對(duì)數(shù)據(jù)庫進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小量插入的時(shí)候的批次大小,類似于設(shè)置緩沖區(qū)大小的意思。batchSize 越大,批量操作時(shí)向數(shù)

44、據(jù)庫發(fā)送sql的次數(shù)越少,速度就越快。 測試結(jié)果是當(dāng)Batch Size=0的時(shí)候,使用Hibernate對(duì)Oracle數(shù)據(jù)庫刪除1萬條記錄需要25秒,Batch Size = 50的時(shí)候,刪除僅僅需要5秒!Oracle數(shù)據(jù)庫 batchSizeatchSize=30=30 的時(shí)候比較合適。對(duì)象關(guān)系映射文件POJO 類和數(shù)據(jù)庫的映射文件*.hbm.xml POJO 類和關(guān)系數(shù)據(jù)庫之間的映射可以用一個(gè)XML文檔來定義。 通過 POJO 類的數(shù)據(jù)庫映射文件,Hibernate可以理解持久化類和數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系,也可以理解持久化類屬性與數(shù)據(jù)庫表列之間的對(duì)應(yīng)關(guān)系 在運(yùn)行時(shí) Hibernate 將根

45、據(jù)這個(gè)映射文件來生成各種 SQL 語句 映射文件的擴(kuò)展名為 .hbm.xmlHiberrnate-mapping映射文件說明 hibernate-mapping 類層次:class 主鍵:id 基本類型:property 實(shí)體引用類: many-to-one | one-to-one 集合:set | list | map | array one-to-many many-to-many 子類:subclass | joined-subclass 其它:component | any 等 查詢語句:query(用來放置查詢語句,便于對(duì)數(shù)據(jù)庫查詢的統(tǒng)一管理和優(yōu)化) 每個(gè)Hibernate-map

46、ping中可以同時(shí)定義多個(gè)類. 但更推薦為每個(gè)類都創(chuàng)建一個(gè)單獨(dú)的映射文件hibernate-mappinghibernate-mapping hibernate-mapping 是是 hibernate hibernate 映射文件的根元素映射文件的根元素schema: schema: 指定所映射的數(shù)據(jù)庫指定所映射的數(shù)據(jù)庫schemaschema的名稱。若指定該屬性的名稱。若指定該屬性, , 則表明會(huì)自動(dòng)添加該則表明會(huì)自動(dòng)添加該 schema schema 前綴前綴catalog:catalog:指定所映射的數(shù)據(jù)庫指定所映射的數(shù)據(jù)庫catalogcatalog的名稱。的名稱。 default-

47、cascade(default-cascade(默認(rèn)為默認(rèn)為 none): none): 設(shè)置設(shè)置hibernatehibernate默認(rèn)的級(jí)聯(lián)風(fēng)默認(rèn)的級(jí)聯(lián)風(fēng)格格. . 若配置若配置 Java Java 屬性屬性, , 集合映射時(shí)沒有指定集合映射時(shí)沒有指定 cascade cascade 屬性屬性, , 則則 Hibernate Hibernate 將采用此處指定的級(jí)聯(lián)風(fēng)格將采用此處指定的級(jí)聯(lián)風(fēng)格. . default-access default-access ( (默認(rèn)為默認(rèn)為 property): property): 指定指定 Hibernate Hibernate 的默認(rèn)的的默認(rèn)的屬

48、性訪問策略。默認(rèn)值為屬性訪問策略。默認(rèn)值為 property, property, 即使用即使用 getter, setter getter, setter 方方法來訪問屬性法來訪問屬性. . 若指定若指定 access, access, 則則 Hibernate Hibernate 會(huì)忽略會(huì)忽略 getter/setter getter/setter 方法方法, , 而通過反射訪問成員變量而通過反射訪問成員變量. .default-lazy(default-lazy(默認(rèn)為默認(rèn)為 true): true): 設(shè)置設(shè)置 HibernatHibernat morning morning的延遲加載

49、的延遲加載策略策略. . 該屬性的默認(rèn)值為該屬性的默認(rèn)值為 true, true, 即啟用延遲加載策略即啟用延遲加載策略. . 若配置若配置 Java Java 屬性映射屬性映射, , 集合映射時(shí)沒有指定集合映射時(shí)沒有指定 lazy lazy 屬性屬性, , 則則 Hibernate Hibernate 將采用此處指定的延遲加載策略將采用此處指定的延遲加載策略 auto-import (auto-import (默認(rèn)為默認(rèn)為 true): true): 指定是否可以在查詢語言中使用非指定是否可以在查詢語言中使用非全限定的類名(僅限于本映射文件中的類)。全限定的類名(僅限于本映射文件中的類)。

50、package (package (可選可選): ): 指定一個(gè)包前綴,如果在映射文檔中沒有指指定一個(gè)包前綴,如果在映射文檔中沒有指定全限定的類名,定全限定的類名, 就使用這個(gè)作為包名。就使用這個(gè)作為包名。 classclass class 元素用于指定類和表的映射元素用于指定類和表的映射namename: :指定該持久化類映射的持久化類的類名指定該持久化類映射的持久化類的類名tabletable: :指定該持久化類映射的表名指定該持久化類映射的表名, Hibernate , Hibernate 默認(rèn)以持默認(rèn)以持久化類的類名作為表名久化類的類名作為表名dynamic-insertdynamic

51、-insert: : 若設(shè)置為若設(shè)置為 true, true, 表示當(dāng)保存一個(gè)對(duì)象時(shí)表示當(dāng)保存一個(gè)對(duì)象時(shí), , 會(huì)動(dòng)態(tài)生成會(huì)動(dòng)態(tài)生成 insert insert 語句語句, insert , insert 語句中僅包含所有取值語句中僅包含所有取值不為不為 null null 的字段的字段. . 默認(rèn)值為默認(rèn)值為 falsefalsedynamic-updatedynamic-update: : 若設(shè)置為若設(shè)置為 true, true, 表示當(dāng)更新一個(gè)對(duì)象表示當(dāng)更新一個(gè)對(duì)象時(shí)時(shí), , 會(huì)動(dòng)態(tài)生成會(huì)動(dòng)態(tài)生成 update update 語句語句, update , update 語句中僅包含所語句

52、中僅包含所有取值需要更新的字段有取值需要更新的字段. . 默認(rèn)值為默認(rèn)值為 falsefalseselect-before-updateselect-before-update: :設(shè)置設(shè)置 Hibernate Hibernate 在更新某個(gè)持久在更新某個(gè)持久化對(duì)象之前是否需要先執(zhí)行一次查詢化對(duì)象之前是否需要先執(zhí)行一次查詢. . 默認(rèn)值為默認(rèn)值為 falsefalsebatch-sizebatch-size: :指定根據(jù)指定根據(jù) OID OID 來抓取實(shí)例時(shí)每批抓取的實(shí)來抓取實(shí)例時(shí)每批抓取的實(shí)例數(shù)例數(shù). .lazylazy: : 指定是否使用延遲加載指定是否使用延遲加載. . mutablem

53、utable: : 若設(shè)置為若設(shè)置為 true, true, 等價(jià)于所有的等價(jià)于所有的 元元素的素的 update update 屬性為屬性為 false, false, 表示整個(gè)實(shí)例不能被更新表示整個(gè)實(shí)例不能被更新. . 默認(rèn)為默認(rèn)為 true. true. discriminator-valuediscriminator-value: : 指定區(qū)分不同子類的值指定區(qū)分不同子類的值. . 當(dāng)使用當(dāng)使用 元素來定義持久化類的繼承關(guān)系時(shí)需要使元素來定義持久化類的繼承關(guān)系時(shí)需要使用該屬性用該屬性映射對(duì)象標(biāo)識(shí)符 Hibernate 使用對(duì)象標(biāo)識(shí)符(OID) 來建立內(nèi)存中的對(duì)象和數(shù)據(jù)庫表中記錄的對(duì)應(yīng)關(guān)

54、系. 對(duì)象的 OID 和數(shù)據(jù)表的主鍵對(duì)應(yīng). Hibernate 通過標(biāo)識(shí)符生成器來為主鍵賦值 Hibernate 推薦在數(shù)據(jù)表中使用代理主鍵, 即不具備業(yè)務(wù)含義的字段. 代理主鍵通常為整數(shù)類型, 因?yàn)檎麛?shù)類型比字符串類型要節(jié)省更多的數(shù)據(jù)庫空間. 在對(duì)象-關(guān)系映射文件中, 元素用來設(shè)置對(duì)象標(biāo)識(shí)符. 子元素用來設(shè)定標(biāo)識(shí)符生成器. Hibernate 提供了標(biāo)識(shí)符生成器接口: IdentifierGenerator, 并提供了各種內(nèi)置實(shí)現(xiàn)id id id:設(shè)定持久化類的:設(shè)定持久化類的 OID OID 和表的主鍵的映射和表的主鍵的映射 namename: : 標(biāo)識(shí)持久化類標(biāo)識(shí)持久化類 OID OID

55、 的屬性名的屬性名 columncolumn: : 設(shè)置標(biāo)識(shí)屬性所映射的設(shè)置標(biāo)識(shí)屬性所映射的數(shù)據(jù)表的數(shù)據(jù)表的列名列名( (主鍵字主鍵字段的名字段的名字). ). unsaved-valueunsaved-value: :若設(shè)定了該屬性若設(shè)定了該屬性, Hibernate , Hibernate 會(huì)通過比會(huì)通過比較持久化類的較持久化類的 OID OID 值和該屬性值來區(qū)分當(dāng)前持久化類值和該屬性值來區(qū)分當(dāng)前持久化類的對(duì)象是否為臨時(shí)對(duì)象的對(duì)象是否為臨時(shí)對(duì)象 typetype: :指定指定 Hibernate Hibernate 映射類型映射類型. Hibernate . Hibernate 映射類型

56、是映射類型是 Java Java 類型與類型與 SQL SQL 類型的橋梁類型的橋梁. . 如果沒有為某個(gè)屬性顯如果沒有為某個(gè)屬性顯式設(shè)定映射類型式設(shè)定映射類型, Hibernate , Hibernate 會(huì)運(yùn)用反射機(jī)制先識(shí)別出會(huì)運(yùn)用反射機(jī)制先識(shí)別出持久化類的特定屬性的持久化類的特定屬性的 Java Java 類型類型, , 然后自動(dòng)使用與之然后自動(dòng)使用與之對(duì)應(yīng)的默認(rèn)的對(duì)應(yīng)的默認(rèn)的 Hibernate Hibernate 映射類型映射類型 Java Java 的基本數(shù)據(jù)類型和包裝類型對(duì)應(yīng)相同的的基本數(shù)據(jù)類型和包裝類型對(duì)應(yīng)相同的 Hibernate Hibernate 映射類型映射類型. .

57、基本數(shù)據(jù)類型無法表達(dá)基本數(shù)據(jù)類型無法表達(dá) null, null, 所以所以對(duì)于持久化類的對(duì)于持久化類的 OID OID 推薦使用包裝類型推薦使用包裝類型saveOrUpdategeneratorgenerator generatorgenerator:設(shè)定持久化類設(shè)定標(biāo)識(shí)符生成器:設(shè)定持久化類設(shè)定標(biāo)識(shí)符生成器class: class: 指定使用的標(biāo)識(shí)符生成器全限定類名或其縮寫名指定使用的標(biāo)識(shí)符生成器全限定類名或其縮寫名主鍵生成策略主鍵生成策略generatorgenerator Hibernate提供的內(nèi)置標(biāo)識(shí)符生成器: increment 標(biāo)識(shí)符生成器 increment 標(biāo)識(shí)符生成器由由

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

59、標(biāo)識(shí)符生成器由底層數(shù)據(jù)庫來負(fù)責(zé)生成標(biāo)識(shí)符, 它要求底層數(shù)據(jù)庫把主鍵定義為自動(dòng)增長字段類型 適用范圍: 由于 identity 生成標(biāo)識(shí)符的機(jī)制依賴于底層數(shù)據(jù)庫系統(tǒng), 因此, 要求底層數(shù)據(jù)庫系統(tǒng)必須支持自動(dòng)增長字段類型. 支持自動(dòng)增長字段類型的數(shù)據(jù)庫包括: DB2, Mysql, MSSQLServer, Sybase 等 OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運(yùn)行時(shí)會(huì)拋出異常sequence 標(biāo)識(shí)符生成器sequence 標(biāo)識(shí)符生成器利用底層數(shù)據(jù)庫提供的序列來生成標(biāo)識(shí)符. Hibernate 在持久化一個(gè) News 對(duì)象時(shí), 先

60、從底層數(shù)據(jù)庫的 news_seq 序列中獲得一個(gè)唯一的標(biāo)識(shí)號(hào), 再把它作為主鍵值適用范圍: 由于 sequence 生成標(biāo)識(shí)符的機(jī)制依賴于底層數(shù)據(jù)庫系統(tǒng)的序列, 因此, 要求底層數(shù)據(jù)庫系統(tǒng)必須支持序列. 支持序列的數(shù)據(jù)庫包括: DB2, Oracle 等 OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運(yùn)行時(shí)會(huì)拋出異常hilo 標(biāo)識(shí)符生成器 hilo 標(biāo)識(shí)符生成器由 Hibernate 按照一種 high/low 算法*生成標(biāo)識(shí)符, 它從數(shù)據(jù)庫的特定表的字段中獲取 high 值. Hibernate 在持久化一個(gè) News 對(duì)象時(shí), 由

溫馨提示

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