Hibernate 對象關系映射_第1頁
Hibernate 對象關系映射_第2頁
Hibernate 對象關系映射_第3頁
Hibernate 對象關系映射_第4頁
Hibernate 對象關系映射_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Prepared by TongGang對象關系映射對象關系映射Prepared by TongGangHibernate 配置文件Prepared by TongGangHibernateHibernate配置文件配置文件 Hibernate 配置文件主要用于配置數(shù)據(jù)庫連接和 Hibernate 運行時所需的各種屬性 每個 Hibernate 配置文件對應一個 Configuration 對象 Hibernate配置文件可以有兩種格式: perties hibernate.cfg.xmlhibernate.cfg.xml Prepared by TongGanghi

2、bernate.cfg.xml的常用屬性 JDBC 連接屬性 connection.url:數(shù)據(jù)庫URL connection.username:數(shù)據(jù)庫用戶名 connection.password:數(shù)據(jù)庫用戶密碼 connection.driver_class:數(shù)據(jù)庫JDBC驅動 dialectdialect:配置數(shù)據(jù)庫的方言,根據(jù)底層的數(shù)據(jù)庫不同產(chǎn)生不同的sql語句,Hibernate 會針對數(shù)據(jù)庫的特性在訪問時進行優(yōu)化Prepared by TongGanghibernate.cfg.xml的常用屬性 C3P0 數(shù)據(jù)庫連接池屬性 vider

3、_class: 該類用來向 Hibernate 提供JDBC連接 hibernate.c3p0.max_size: 數(shù)據(jù)庫連接池的最大連接數(shù) hibernate.c3p0.min_size: 數(shù)據(jù)庫連接池的最小連接數(shù) hibernate.c3p0.timeout: 數(shù)據(jù)庫連接池中連接對象在多長時間沒有使用過后,就應該被銷毀 hibernate.c3p0.max_statements: 緩存 Statement 對象的數(shù)量 hibernate.c3p0.idle_test_period: 表示連接池檢測線程檢測線程多長時間檢測一次池內的所有鏈接對象是否超時. 連接池本身不會把自己從連接池中移除,

4、而是專門有一個線程按照一定的時間間隔來做這件事,這個線程通過比較連接對象最后一次被使用時間和當前時間的時間差來和 timeout 做對比,進而決定是否銷毀這個連接對象。 hibernate.c3p0.acquire_increment: 當數(shù)據(jù)庫連接池中的連接耗盡時, 同一時刻獲取多少個數(shù)據(jù)庫連接 hibernate.c3p0.validate: 是否每次連接都驗證連接是否可用Prepared by TongGanghibernate.cfg.xml的常用屬性 其他 show_sql:是否將運行期生成的SQL輸出到日志以供調試。取值 true | false format_sql:是否將 SQ

5、L 轉化為格式良好的 SQL . 取值 true | false use_sql_comments:是否在 Hibernate 生成的 SQL 語句中添加有助于調試的注釋 hbm2ddl.auto:在啟動和停止時自動地創(chuàng)建,更新或刪除數(shù)據(jù)庫模式。取值 create | update | create-drop | validate* hibernate.jdbc.fetch_size hibernate.jdbc.batch_sizePrepared by TongGangjdbc.fetch_sizejdbc.fetch_size 和和 jdbc.batch_sizejdbc.batch_s

6、izehibernate.jdbc.fetch_size:實質是調用 Statement.setFetchSize() 方法設定設定 JDBC JDBC 的的 Statement Statement 讀取數(shù)據(jù)讀取數(shù)據(jù)的時候每次從數(shù)據(jù)庫中取出的記錄條數(shù)的時候每次從數(shù)據(jù)庫中取出的記錄條數(shù)。 例如一次查詢1萬條記錄,對于Oracle的JDBC驅動來說,是不會 1 次性把1萬條取出來的,而只會取出 fetchSize 條數(shù),當記錄集遍歷完了這些記錄以后,再去數(shù)據(jù)庫取 fetchSize 條數(shù)據(jù)。因此大大節(jié)省了無謂的內存消耗。Fetch Size設的越大,讀數(shù)據(jù)庫的次數(shù)越少,速度越快;Fetch Siz

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

8、hSize 越大,批量操作的向數(shù)據(jù)庫發(fā)送sql的次數(shù)越少,速度就越快。 測試結果是當Batch Size=0的時候,使用Hibernate對Oracle數(shù)據(jù)庫刪除1萬條記錄需要25秒,Batch Size = 50的時候,刪除僅僅需要5秒!Oracle數(shù)據(jù)庫 batchSizeatchSize=30=30 的時候比較合適。Prepared by TongGang對象關系映射文件Prepared by TongGang實體類和數(shù)據(jù)庫的映射文件*.hbm.xml 實體類和關系數(shù)據(jù)庫之間的映射可以用一個XML文檔來定義。 通過實體類的數(shù)據(jù)庫映射文件,Hibernate可以理解持久化類和數(shù)據(jù)表之間的對

9、應關系,也可以理解持久化類屬性與數(shù)據(jù)庫表列之間的對應關系 在運行時 Hibernate 將根據(jù)這個映射文件來生成各種 SQL 語句 映射文件的擴展名為 .hbm.xmlPrepared by TongGang映射文件說明 hibernate-mapping 類層次:class 主鍵。id 基本類型:property 實體引用類: many-to-one | one-to-one 集合:set | list | map | array one-to-many many-to-many 子類:subclass | joined-subclass 其它:component | any 等 查詢語句:

10、query(用來放置查詢語句,便于對數(shù)據(jù)庫查詢的統(tǒng)一管理和優(yōu)化) 一個 hibernate-mapping 中可以同時定義多個類. 但更推薦推薦為每個類都創(chuàng)建一個單獨的映射文件為每個類都創(chuàng)建一個單獨的映射文件Prepared by TongGanghibernate-mappinghibernate-mapping hibernate-mapping 是是 hibernate hibernate 映射文件的映射文件的根元素根元素schema: schema: 指定所映射的數(shù)據(jù)庫指定所映射的數(shù)據(jù)庫schemaschema的名稱。若指定該的名稱。若指定該屬性屬性, , 則表明會自動添加該則表明會自

11、動添加該 schema schema 前綴前綴catalog:catalog:指定所映射的數(shù)據(jù)庫指定所映射的數(shù)據(jù)庫catalogcatalog的名稱。的名稱。 default-cascadedefault-cascade( (默認為默認為 none): none): 設置設置hibernatehibernate默認的默認的級聯(lián)風格級聯(lián)風格. . 若配置若配置 Java Java 屬性屬性, , 集合映射時沒有指定集合映射時沒有指定 cascade cascade 屬性屬性, , 則則 Hibernate Hibernate 將采用此處指定的級聯(lián)風將采用此處指定的級聯(lián)風格格. . default

12、-accessdefault-access ( (默認為默認為 property): property): 指定指定 Hibernate Hibernate 的默認的屬性訪問策略。默認值為的默認的屬性訪問策略。默認值為 property, property, 即使用即使用 getter, setter getter, setter 方法來訪問屬性方法來訪問屬性. . 若指定若指定 access, access, 則則 Hibernate Hibernate 會忽略會忽略 getter/setter getter/setter 方法方法, , 而通過反射訪而通過反射訪問成員變量問成員變量. .d

13、efault-lazydefault-lazy( (默認為默認為 true): true): 設置設置 HibernatHibernat morning morning的延遲加載策略的延遲加載策略. . 該屬性的默認值為該屬性的默認值為 true, true, 即啟用延遲即啟用延遲加載策略加載策略. . 若配置若配置 Java Java 屬性映射屬性映射, , 集合映射時沒有指集合映射時沒有指定定 lazy lazy 屬性屬性, , 則則 Hibernate Hibernate 將采用此處指定的延遲加將采用此處指定的延遲加載策略載策略 auto-import (auto-import (默認為

14、默認為 true): true): 指定是否可以在查詢語言指定是否可以在查詢語言中使用非全限定的類名(僅限于本映射文件中的類)。中使用非全限定的類名(僅限于本映射文件中的類)。 package (package (可選可選): ): 指定一個包前綴,如果在映射文檔中指定一個包前綴,如果在映射文檔中沒有指定全限定的類名,沒有指定全限定的類名, 就使用這個作為包名。就使用這個作為包名。 Prepared by TongGangclassclass class 元素用于指定類和表的映射元素用于指定類和表的映射namename: :指定該持久化類映射的持久化類的類名指定該持久化類映射的持久化類的類名t

15、abletable: :指定該持久化類映射的表名指定該持久化類映射的表名, Hibernate , Hibernate 默認默認以持久化類的類名作為表名以持久化類的類名作為表名dynamic-insertdynamic-insert: : 若設置為若設置為 true, true, 表示當保存一個表示當保存一個對象時對象時, , 會動態(tài)生成會動態(tài)生成 insert insert 語句語句, insert , insert 語句中語句中僅包含所有取值不為僅包含所有取值不為 null null 的字段的字段. . 默認值為默認值為 falsefalsedynamic-updatedynamic-up

16、date: : 若設置為若設置為 true, true, 表示當更新一個表示當更新一個對象時對象時, , 會動態(tài)生成會動態(tài)生成 update update 語句語句, update , update 語句中語句中僅包含所有取值需要更新的字段僅包含所有取值需要更新的字段. . 默認值為默認值為 falsefalseselect-before-updateselect-before-update: :設置設置 Hibernate Hibernate 在更新某個在更新某個持久化對象之前是否需要先執(zhí)行一次查詢持久化對象之前是否需要先執(zhí)行一次查詢. . 默認值為默認值為 falsefalsebatch-

17、sizebatch-size: :在關聯(lián)對象圖時在關聯(lián)對象圖時, , 指定根據(jù)指定根據(jù) OID OID 來抓取來抓取實例時每批抓取的實例數(shù)實例時每批抓取的實例數(shù). .lazylazy: : 指定是否使用延遲加載指定是否使用延遲加載. . mutablemutable: : 若設置為若設置為 true, true, 等價于所有的等價于所有的 元素的元素的 update update 屬性為屬性為 false, false, 表示整表示整個實例不能被更新個實例不能被更新. . 默認為默認為 true. true. discriminator-valuediscriminator-value: :

18、指定區(qū)分不同子類的值指定區(qū)分不同子類的值. . 當當使用使用 元素來定義持久化類的繼承關系元素來定義持久化類的繼承關系時需要使用該屬性時需要使用該屬性Prepared by TongGang映射對象標識符 Hibernate 使用對象標識符使用對象標識符(OID) (OID) 來建立內存中的對象和數(shù)來建立內存中的對象和數(shù)據(jù)庫表中記錄的對應關系據(jù)庫表中記錄的對應關系. 對象的 OID 和數(shù)據(jù)表的主鍵對應. Hibernate 通過標識符生成器來為 OID 賦值 Hibernate Hibernate 推薦在數(shù)據(jù)表中使用代理主鍵推薦在數(shù)據(jù)表中使用代理主鍵, , 即不具備業(yè)務含即不具備業(yè)務含義的字段

19、義的字段. 代理主鍵通常為整數(shù)類型, 因為整數(shù)類型比字符串類型要節(jié)省更多的數(shù)據(jù)庫空間. 在對象-關系映射文件中, 元素用來設置對象標識符. 子元素用來設定標識符生成器. Hibernate 提供了標識符生成器接口: IdentifierGenerator, 并提供了各種內置實現(xiàn)Prepared by TongGangididid:設定持久化類的:設定持久化類的 OID OID 和表的主鍵的映射和表的主鍵的映射namename: : 標識持久化類標識持久化類 OID OID 的屬性名的屬性名 columncolumn: : 設置標識屬性所映射的數(shù)據(jù)列的列名設置標識屬性所映射的數(shù)據(jù)列的列名( (主

20、鍵字段的主鍵字段的名字名字). ). unsaved-valueunsaved-value: :若設定了該屬性若設定了該屬性, Hibernate , Hibernate 會通過比較持會通過比較持久化類的久化類的 OID OID 值和該屬性值來區(qū)分當前持久化類的對象是值和該屬性值來區(qū)分當前持久化類的對象是否為臨時對象否為臨時對象typetype: :指定指定 Hibernate Hibernate 映射類型映射類型. Hibernate . Hibernate 映射類型是映射類型是 Java Java 類型與類型與 SQL SQL 類型的橋梁類型的橋梁. . 如果沒有為某個屬性顯式設如果沒有為

21、某個屬性顯式設定映射類型定映射類型, Hibernate , Hibernate 會運用反射機制先識別出持久化類會運用反射機制先識別出持久化類的特定屬性的的特定屬性的 Java Java 類型類型, , 然后自動使用與之對應的默認的然后自動使用與之對應的默認的 Hibernate Hibernate 映射類型映射類型Java Java 的基本數(shù)據(jù)類型和包裝類型對應相同的的基本數(shù)據(jù)類型和包裝類型對應相同的 Hibernate Hibernate 映映射類型射類型. . 基本數(shù)據(jù)類型無法表達基本數(shù)據(jù)類型無法表達 null, null, 所以對于所以對于持久化類持久化類的的 OID OID 推薦使用

22、包裝類型推薦使用包裝類型Prepared by TongGanggeneratorgenerator generatorgenerator:設定持久化類設定標識符生成器:設定持久化類設定標識符生成器class: class: 指定使用的標識符生成器全限定類名或其縮寫名指定使用的標識符生成器全限定類名或其縮寫名Prepared by TongGang主鍵生成策略主鍵生成策略generatorgenerator Hibernate提供的內置標識符生成器: Prepared by TongGangincrement 標識符生成器 increment 標識符生成器由由 HibernateHiberna

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

24、 identity 標識符生成器由底層數(shù)據(jù)庫來負責生成標識符, 它要求底層數(shù)據(jù)庫把主鍵定義為自動增長字段類型把主鍵定義為自動增長字段類型 適用范圍: 由于 identity 生成標識符的機制依賴于底層數(shù)據(jù)庫系統(tǒng), 因此, 要求底層數(shù)據(jù)庫系統(tǒng)必須支持自動增長字段類型要求底層數(shù)據(jù)庫系統(tǒng)必須支持自動增長字段類型. 支持自動增長字段類型的數(shù)據(jù)庫包括: DB2, Mysql, MSSQLServer, Sybase 等 OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常Prepared by TongGangsequence 標識符生

25、成器 sequence 標識符生成器利用底層數(shù)據(jù)庫提供的序列序列來生成標識符. Hibernate 在持久化一個 News 對象時, 先從底層數(shù)據(jù)庫的 news_seq 序列中獲得一個唯一的標識號, 再把它作為主鍵值 適用范圍: 由于 sequence 生成標識符的機制依賴于底層數(shù)據(jù)庫系統(tǒng)的序列, 因此, 要求底層數(shù)據(jù)庫系統(tǒng)必須支持序列底層數(shù)據(jù)庫系統(tǒng)必須支持序列. 支持序列的數(shù)據(jù)庫包括: DB2 Oracle 等 OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常Prepared by TongGanghilo 標識符生成器

26、 hilo 標識符生成器由 Hibernate 按照一種 high/low 算法算法*生成標識符, 它從數(shù)據(jù)庫的特定表的字段中獲取 high 值. Hibernate 在持久化一個 News 對象時, 由 Hibernate 負責生成主鍵值. hilohilo 標識符生成器在生成標識符時標識符生成器在生成標識符時, , 需要需要讀取并修改讀取并修改 HI_TABLE HI_TABLE 表中的表中的 NEXT_VALUE NEXT_VALUE 值值. 適用范圍: 由于 hilo 生存標識符機制不依賴于底層數(shù)據(jù)庫系統(tǒng), 因此它適合所有的數(shù)據(jù)庫系統(tǒng) OID 必須為 long, int 或 short

27、 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常Prepared by TongGangnative 標識符生成器 native 標識符生成器依據(jù)底層數(shù)據(jù)庫對自動生成標識符的支持能力, 來選擇使用 identity, sequence 或 hilo 標識符生成器. 適用范圍: 由于 native 能根據(jù)底層數(shù)據(jù)庫系統(tǒng)的類型, 自動選擇合適的標識符生成器, 因此很適合于跨數(shù)據(jù)庫平臺開發(fā) OID 必須為 long, int 或 short 類型, 如果把 OID 定義為 byte 類型, 在運行時會拋出異常Prepared by TongGangPropertypropert

28、y property 元素用于指定類的屬性和表的字段元素用于指定類的屬性和表的字段的映射的映射namename: :指定該持久化類的屬性的名字指定該持久化類的屬性的名字columncolumn: :指定與類的屬性映射的表的字段名指定與類的屬性映射的表的字段名. . 如果沒有如果沒有設置該屬性設置該屬性, Hibernate , Hibernate 將直接使用類的屬性名作為將直接使用類的屬性名作為字段名字段名. . typetype: :指定指定 Hibernate Hibernate 映射類型映射類型. Hibernate . Hibernate 映射類映射類型是型是 Java Java 類型

29、與類型與 SQL SQL 類型的橋梁類型的橋梁. . 如果沒有為某個如果沒有為某個屬性顯式設定映射類型屬性顯式設定映射類型, Hibernate , Hibernate 會運用反射機制會運用反射機制先識別出持久化類的特定屬性的先識別出持久化類的特定屬性的 Java Java 類型類型, , 然后自然后自動使用與之對應的默認的動使用與之對應的默認的 Hibernate Hibernate 映射類型映射類型. .not-nullnot-null: :若該屬性值為若該屬性值為 true, true, 表明不允許為表明不允許為 null, null, 默認為默認為 falsefalseinsertin

30、sert: : 如果為如果為 false, false, 在在 insert insert 語句中不包含該語句中不包含該字段字段, , 表明該字段永遠不能被插入表明該字段永遠不能被插入. . 默認值為默認值為 truetrueupdateupdate: :如果為如果為 false, false, 在在 update update 語句中不包含該字語句中不包含該字段段, , 表明該字段永遠不能被更新表明該字段永遠不能被更新. . 默認值為默認值為 truetrueaccessaccess: :指定指定 Hibernate Hibernate 的默認的屬性訪問策略。默的默認的屬性訪問策略。默認值為

31、認值為 property, property, 即使用即使用 getter, setter getter, setter 方法來訪方法來訪問屬性問屬性. . 若指定若指定 access, access, 則則 Hibernate Hibernate 會忽略會忽略 getter/setter getter/setter 方法方法, , 而通過反射訪問成員變量而通過反射訪問成員變量Prepared by TongGangproperty property 元素用于指定類的屬性和表的字段元素用于指定類的屬性和表的字段的映射的映射uniqueunique: : 設置是否為該屬性所映射的數(shù)據(jù)列添加唯一設

32、置是否為該屬性所映射的數(shù)據(jù)列添加唯一約束約束. . 若設置為若設置為 true, true, 就允許該字段作為就允許該字段作為 property-property-ref ref 引用的目標引用的目標indexindex: : 指定一個字符串的索引名稱指定一個字符串的索引名稱. . 當系統(tǒng)需要當系統(tǒng)需要 Hibernate Hibernate 自動建表時自動建表時, , 用于為該屬性所映射的數(shù)據(jù)用于為該屬性所映射的數(shù)據(jù)列創(chuàng)建索引列創(chuàng)建索引, , 從而加快給予該數(shù)據(jù)列的查詢從而加快給予該數(shù)據(jù)列的查詢. .lengthlength: : 指定該屬性所映射數(shù)據(jù)列的字段的長度指定該屬性所映射數(shù)據(jù)列的字

33、段的長度scalescale: : 指定該屬性所映射數(shù)據(jù)列的小數(shù)位數(shù)指定該屬性所映射數(shù)據(jù)列的小數(shù)位數(shù), , 對對 double, float, decimal double, float, decimal 等類型的數(shù)據(jù)列有效等類型的數(shù)據(jù)列有效. .formulaformula:設置一個:設置一個 SQL SQL 表達式表達式, Hibernate , Hibernate 將根據(jù)將根據(jù)它來計算出派生屬性的值它來計算出派生屬性的值. . 派生屬性派生屬性: : 并不是持久化類的所有屬性都直接和表的并不是持久化類的所有屬性都直接和表的字段匹配字段匹配, , 持久化類的有些屬性的值必須在運行時通持久化

34、類的有些屬性的值必須在運行時通過計算才能得出來過計算才能得出來, , 這種屬性稱為派生屬性這種屬性稱為派生屬性使用使用 formula formula 屬性時屬性時formula=“(sqlformula=“(sql)” )” 的英文括號不能少的英文括號不能少SqlSql 表達式中的列名和表名都應該和數(shù)據(jù)庫對應表達式中的列名和表名都應該和數(shù)據(jù)庫對應, , 而而不是和持久化對象的屬性對應不是和持久化對象的屬性對應如果需要在如果需要在 formula formula 屬性中使用參數(shù)屬性中使用參數(shù), , 這直接使用這直接使用 where cur.idwhere cur.id=id =id 形式形式,

35、 , 其中其中 id id 就是參數(shù)就是參數(shù), , 和當前和當前持久化對象的持久化對象的 id id 屬性對應的列的屬性對應的列的 id id 值將作為參數(shù)值將作為參數(shù)傳入傳入. . Property*Prepared by TongGangJava Java 類型類型, Hibernate , Hibernate 映射類型及映射類型及 SQL SQL 類型之間的對應關系類型之間的對應關系 Prepared by TongGangJava Java 類型類型, Hibernate , Hibernate 映射類型及映射類型及 SQL SQL 類型之間的對應關系類型之間的對應關系Prepared

36、 by TongGangJava 時間和日期類型的 Hibernate 映射類型在 Java 中, 代表時間和日期的類型包括: java.util.Date 和 java.util.Calendar. 此外, 在 JDBC API 中還提供了 3 個擴展了 java.util.Date 類的子類: java.sql.Date, java.sql.Time 和 java.sql.Timestamp, 這三個類分別和標準 SQL 類型中的 DATE, TIME 和 TIMESTAMP 類型對應在標準 SQL 中, DATE 類型表示日期, TIME 類型表示時間, TIMESTAMP 類型表示時間

37、戳, 同時包含日期和時間信息. Prepared by TongGangJava 大對象類型的 Hiberante 映射類型在 Java 中, java.lang.String 可用于表示長字符串(長度超過 255), 字符數(shù)組 byte 可用于存放圖片或文件的二進制數(shù)據(jù). 此外, 在 JDBC API 中還提供了 java.sql.Clob 和 java.sql.Blob 類型, 它們分別和標準 SQL 中的 CLOB 和 BLOB 類型對應. CLOB 表示字符串大對象(Character Large Object), BLOB表示二進制大對象(Binary Large Object)My

38、sql 不支持標準 SQL 的 CLOB 類型, 在 Mysql 中, 用 TEXT, MEDIUMTEXT 及 LONGTEXT 類型來表示長度操作 255 的長文本數(shù)據(jù)在持久化類中, 二進制大對象可以聲明為 byte 或 java.sql.Blob 類型; 字符串可以聲明為 java.lang.String 或 java.sql.Blob實際上在 Java 應用程序中處理長度超過 255 的字符串, 使用 java.lang.String 比 java.sql.Clob 更方便; 使用 byte 比 java.sql.Blob 更方便. Prepared by TongGang使用 Hib

39、ernate 內置映射類型 以下情況下必須顯式指定必須顯式指定 Hibernate Hibernate 映射類型映射類型 一個 Java 類型對應多個 Hibernate 映射類型時. 例如: 如果持久化類的屬性為 java.util.Date 類型, 對應的 Hibernate 映射類型可以是 date, time 或 timestamp. 此時必須根據(jù)對應的數(shù)據(jù)表的字段的 SQL 類型, 來確定 Hibernate 映射類型. 如果字段為 DATE 類型, 那么 Hibernate 映射類型為 date; 如果字段為 TIME 類型, 那么 Hibernate 映射類型為 time; 如果

40、字段為 TIMESTATMP 類型, 那么 Hibernate 映射類型為 timestamp.Prepared by TongGang練習1根據(jù)給定的 Java 類寫出相對應的 hbm.xml 文件, 由 Hibernate 生成 對應的數(shù)據(jù)表,并完成對 Customer 記錄在數(shù)據(jù)表中增刪改查操作Prepared by TongGang映射組成關系* 建立域模型和關系數(shù)據(jù)模型有著不同的出發(fā)點: 域模型: 由程序代碼組成由程序代碼組成, , 通過細化持久化類的的粒度可提高代碼的可通過細化持久化類的的粒度可提高代碼的可重用性重用性, , 簡化編程簡化編程 關系數(shù)據(jù)模型: 由關系數(shù)據(jù)組成由關系數(shù)

41、據(jù)組成, 在存在數(shù)據(jù)冗余的情況下, 需要把粗粒度的表拆分成具有外鍵參照關系的幾個細粒度的表, 從而節(jié)省存儲空間; 另一方面, 在沒有數(shù)據(jù)冗余的情況下在沒有數(shù)據(jù)冗余的情況下, , 應該盡可能減少表的數(shù)目應該盡可能減少表的數(shù)目, , 簡化表之間的參照關系簡化表之間的參照關系, , 以便提高數(shù)據(jù)的訪問速度以便提高數(shù)據(jù)的訪問速度Prepared by TongGang映射組成關系 Hibernate 把持久化類的屬性分為兩種: 值值(value)(value)類型類型: 沒有沒有 OIDOID, 不能被單獨持久化不能被單獨持久化, 生命周期依賴于所屬生命周期依賴于所屬的持久化類的對象的生命周期的持久化

42、類的對象的生命周期 實體(entity)類型: 有 OID, 可以被單獨持久化, 有獨立的生命周期 顯然無法直接用 property 映射 name 屬性 Hibernate 使用 元素來映射組成關系, 該元素表明 pay 屬性是 Worker 類一個組成部分, 在 Hibernate 中稱之為組件組件Prepared by TongGangcomponent 元素來映射組成關系元素來映射組成關系 class:class:設定組成關系屬性的類型設定組成關系屬性的類型, , 此處表明此處表明 pay pay 屬屬性為性為 Pay Pay 類型類型 parent 元素元素指定指定組件屬性所屬的整體

43、類組件屬性所屬的整體類 name: name: 整體類在組件類中的屬性名整體類在組件類中的屬性名Prepared by TongGang映射一對多關聯(lián)關系Prepared by TongGang一對多關聯(lián)關系 在域模型中, 類與類之間最普遍的關系就是關聯(lián)關系. 在 UML 中, 關聯(lián)是有方向的. 以 Customer 和 Order 為例: 一個用戶能發(fā)出多個訂單, 而一個訂單只能屬于一個客戶. 從 Order 到 Customer 的關聯(lián)使多對一關聯(lián); 而從 Customer 到 Order 是一對多關聯(lián) 單向關聯(lián) 雙向關聯(lián)Prepared by TongGang單向 n-1 單向 n-1

44、關聯(lián)只需從 n 的一端可以訪問 1 的一端 域模型: 從 Order 到 Customer 的多對一單向關聯(lián)需要在Order 類中定義一個 Customer 屬性, 而在 Customer 類中無需定義存放 Order 對象的集合屬性 關系數(shù)據(jù)模型:ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵ORDERS 表CUSTOMERS 表Prepared by TongGang單向 n-1 顯然無法直接用 property 映射 customer 屬性 因為 Customer 有主鍵, 所以也不能使用 component 進行映射 Hibernate 使用 元素來映射

45、多對一關聯(lián)關系Prepared by TongGangmany-to-one many-to-one 元素來映射元素來映射多對一的關聯(lián)關系多對一的關聯(lián)關系 name: name: 設定待映射的持久化類的屬性的名字設定待映射的持久化類的屬性的名字 column: column: 設定和持久化類的屬性對應的表的外鍵設定和持久化類的屬性對應的表的外鍵 classclass:設定待映射的持久化類的屬性的類型:設定待映射的持久化類的屬性的類型Prepared by TongGang雙向 1-n 雙向 1-n 與 雙向 n-1 是完全相同的兩種情形 雙向 1-n 需要在 1 的一端可以訪問 n 的一端,

46、反之依然. 域模型:從 Order 到 Customer 的多對一單向關聯(lián)需要在Order 類中定義一個 Customer 屬性, 而在 Customer 類中需定義存放 Order 對象的集合屬性 關系數(shù)據(jù)模型:ORDERS 表中的 CUSTOMER_ID 參照 CUSTOMER 表的主鍵ORDERS 表CUSTOMERS 表Prepared by TongGang雙向 1-n 當 Session 從數(shù)據(jù)庫中加載 Java 集合時, 創(chuàng)建的是 Hibernate 內置集合類的實例, 因此在持久化類中定義集合屬在持久化類中定義集合屬性時必須把屬性聲明為性時必須把屬性聲明為 Java Java

47、接口類型接口類型 Hibernate 的內置集合類具有集合代理功能, 支持延遲檢索策略 Hibernate 的內置集合類都封裝了 JDK 中的集合類, 這使得 Hibernate 能夠對緩存中的集合對象進行臟檢查, 按照集合對象的狀態(tài)來同步更新數(shù)據(jù)庫。 在定義集合屬性時在定義集合屬性時, , 通常把它初始化為集合實現(xiàn)類的一個實例通常把它初始化為集合實現(xiàn)類的一個實例. 這樣可以提高程序的健壯性, 避免應用程序訪問取值為 null 的集合的方法而拋出 NullPointerExceptionPrepared by TongGang雙向 1-n Hibernate 使用 元素來映射 set 類型的屬

48、性Prepared by TongGangset set 元素來映射元素來映射持久化持久化類的類的 set set 類型的屬性類型的屬性 name: name: 設定待映射的持久化類的屬性名設定待映射的持久化類的屬性名Prepared by TongGangkey key 元素元素設定設定與所關聯(lián)的持久化類對應的表的外鍵與所關聯(lián)的持久化類對應的表的外鍵 column: column: 指定關聯(lián)表的外鍵名指定關聯(lián)表的外鍵名Prepared by TongGangone-to-many one-to-many 元素元素設定設定集合屬性中所關聯(lián)的持久化集合屬性中所關聯(lián)的持久化類類 class: cl

49、ass: 指定關聯(lián)的持久化類的類名指定關聯(lián)的持久化類的類名Prepared by TongGangcascade 屬性在對象 關系映射文件中, 用于映射持久化類之間關聯(lián)關系的元素, , 和 都有一個 cascade 屬性, 它用于指定如何操指定如何操縱與當前對象關聯(lián)的其他對象縱與當前對象關聯(lián)的其他對象. Prepared by TongGang 元素的 inverse 屬性 在在hibernatehibernate中通過對中通過對 inverse inverse 屬性的來決定是由雙向關聯(lián)屬性的來決定是由雙向關聯(lián)的哪一方來維護表和表之間的關系的哪一方來維護表和表之間的關系. inverse=fa

50、lse . inverse=false 的為主的為主動方,動方,inverse=true inverse=true 的為被動方的為被動方, , 由主動方負責維護關聯(lián)由主動方負責維護關聯(lián)關系關系 在沒有設置在沒有設置 inverse=true inverse=true 的情況下,父子兩邊都維護父子的情況下,父子兩邊都維護父子 關系關系 在 1-n 關系中,將 n 方設為主控方將有助于性能改善(如果要國家元首記住全國人民的名字,不是太可能,但要讓全國人民知道國家元首,就容易的多) 在 1-N 關系中,若將 1 方設為主控方 會額外多出 update 語句。 插入數(shù)據(jù)時無法同時插入外鍵列,因而無法為

51、外鍵列添加非空約束Prepared by TongGang在數(shù)據(jù)庫中對集合排序 元素有一個 order-by 屬性, 如果設置了該屬性, 當 Hibernate 通過 select 語句到數(shù)據(jù)庫中檢索集合對象時, 利用 order by 子句進行排序 order-by 屬性中還可以加入 SQL 函數(shù)Prepared by TongGang映射一對一關聯(lián)關系Prepared by TongGang1 - 1 域模型 關系數(shù)據(jù)模型: 按照外鍵映射: 按照主鍵映射:DEPARTMENTS 表MANAGERS 表DEPARTMENTS 表MANAGERS 表Prepared by TongGang基于

52、外鍵映射的 1-1 對于基于外鍵的1-1關聯(lián),其外鍵可以存放在任意一邊,在需在需要存放外鍵一端,增加要存放外鍵一端,增加 many-to-one many-to-one 元素元素。為 many-to-one元素增加 unique=“true” 屬性來表示為1-1關聯(lián),并用name屬性來指定關聯(lián)屬性的屬性名 另一端需要使用one-to-one元素,該元素使用 property-refproperty-ref 屬性指定使用被關聯(lián)實體主鍵以外的字段作為關聯(lián)字段 不使用 property-ref 屬性的 sql 使用 property-ref 屬性的 sqlPrepared by TongGang基于

53、主鍵映射的 1-1基于主鍵的映射策略:指一端的主鍵生成器使用 foreign 策略,表明根據(jù)”對方對方”的主鍵來生成自己的主鍵,自己并不能獨立生成主鍵. 子元素指定使用當前持久化類的哪個屬性作為 “對方對方”采用foreign主鍵生成器策略的一端增加 one-to-one 元素映射關聯(lián)屬性,其 one-to-one 屬性還應增加 constrained=“true”constrained=“true” 屬性;另一端增加one-to-one元素映射關聯(lián)屬性。constrained(約束):指定為當前持久化類對應的數(shù)據(jù)庫表的主鍵添加一個外鍵約束,引用被關聯(lián)的對象(“對方對方”)所對應的數(shù)據(jù)庫表主鍵

54、Prepared by TongGang映射多對多關聯(lián)關系Prepared by TongGang單向 n-n 域模型: 關系數(shù)據(jù)模型CATEGORIES 表CATEGORIES_ITEMS 表ITEMS 表Prepared by TongGang單向 n-n n-n 的關聯(lián)必須使用連接表的關聯(lián)必須使用連接表 與 1-n 映射類似,必須為 set 集合元素添加 key 子元素,指定 CATEGORIES_ITEMS 表中參照 CATEGORIES 表的外鍵為 CATEGORIY_ID. 與 1-n 關聯(lián)映射不同的是,建立 n-n 關聯(lián)時, 集合中的元素使用 many-to-many. many

55、-to-many 子元素的 class 屬性指定 items 集合中存放的是 Item 對象, column 屬性指定 CATEGORIES_ITEMS 表中參照 ITEMS 表的外鍵為 ITEM_IDPrepared by TongGangPrepared by TongGang雙向 n-n 域模型: 關系數(shù)據(jù)模型CATEGORIES 表CATEGORIES_ITEMS 表ITEMS 表Prepared by TongGang雙向n-n關聯(lián) 雙向 n-n 關聯(lián)需要兩端都使用集合屬性兩端都使用集合屬性 雙向n-n關聯(lián)必須使用連接表必須使用連接表 集合屬性應增加 key 子元素用以映射外鍵列,

56、集合元素里還應增加many-to-many子元素關聯(lián)實體類 在雙向在雙向 n-n 關聯(lián)的兩邊都需指定連接表的表名及外鍵列的列關聯(lián)的兩邊都需指定連接表的表名及外鍵列的列名名. 兩個集合元素兩個集合元素 set 的的 table 元素的值必須指定,而且必須元素的值必須指定,而且必須相同。相同。set元素的兩個子元素:元素的兩個子元素:key 和和 many-to-many 都必須都必須指定指定 column 屬性,其中,屬性,其中,key 和和 many-to-many 分別指定分別指定本持久化類和關聯(lián)類在連接表中的外鍵列名,因此兩邊的本持久化類和關聯(lián)類在連接表中的外鍵列名,因此兩邊的 key 與

57、與 many-to-many 的的column屬性交叉相同屬性交叉相同。也就是說,一邊的set元素的key的 cloumn值為a,many-to-many 的 column 為b;則另一邊的 set 元素的 key 的 column 值 b,many-to-many的 column 值為 a. 對于雙向對于雙向 n-n 關聯(lián)關聯(lián), 須把其中一端的須把其中一端的 inverse 設置為設置為 true, 否則可能會造成主鍵沖突.Prepared by TongGang映射繼承關系Prepared by TongGang繼承映射 對于面向對象的程序設計語言而言,繼承和多態(tài)是兩個最基本的概念。Hibernate 的繼承映射可以理解持久化類之間的繼承關系。例如:人和學生之間的關系。學生繼承了人,可以認為學生是一個特殊的人,如果對人進行查詢,學生的實例也將被得到。Prepared

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論