Hibernate_映射配置文件詳解.ppt_第1頁(yè)
Hibernate_映射配置文件詳解.ppt_第2頁(yè)
Hibernate_映射配置文件詳解.ppt_第3頁(yè)
Hibernate_映射配置文件詳解.ppt_第4頁(yè)
Hibernate_映射配置文件詳解.ppt_第5頁(yè)
已閱讀5頁(yè),還剩75頁(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)介

映射文件詳解,目標(biāo),學(xué)習(xí)hibernate的配置文件(hibernate.cfg.xml) 學(xué)習(xí)hibernate的映射聲明(*.hbm.xml),hibernate配置文件,hibernate配置文件主要用于配置數(shù)據(jù)庫(kù)連接和 hibernate 運(yùn)行時(shí)所需的各種屬性 每個(gè) hibernate 配置文件對(duì)應(yīng)一個(gè) configuration 對(duì)象。 hibernate配置文件可以有兩種格式: perties hibernate.cfg.xml,hibernate.cfg.xml的常用屬性,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) show_sql:是否將運(yùn)行期生成的sql輸出到日志以供調(diào)試。取值 true | false 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)化。 hbm2ddl.auto:在啟動(dòng)和停止時(shí)自動(dòng)地創(chuàng)建,更新或刪除數(shù)據(jù)庫(kù)模式。取值 create | update | create-drop mapping resource:映射文件配置,配置文件名必須包含其相對(duì)于根的全路徑 connection.datasource :jndi數(shù)據(jù)源的名稱,jdbc.fetch_size 和 jdbc.batch_size,jdbc.fetch_size:實(shí)質(zhì)是調(diào)用 statement.setfetchsize() 方法設(shè)定jdbc的statement讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫(kù)中取出的記錄條數(shù)。例如一次查詢1萬(wàn)條記錄,對(duì)于oracle的jdbc驅(qū)動(dòng)來(lái)說(shuō),是不會(huì) 1 次性把1萬(wàn)條取出來(lái)的,而只會(huì)取出fetch size條數(shù),當(dāng)紀(jì)錄集遍歷完了這些記錄以后,再去數(shù)據(jù)庫(kù)取fetch size條數(shù)據(jù)。因此大大節(jié)省了無(wú)謂的內(nèi)存消耗。當(dāng)然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)fetch size=100,性能還能繼續(xù)提升20%,fetch size繼續(xù)增大,性能提升的就不顯著了。建議使用oracle時(shí)將fetch size設(shè)到50。并不是所有的數(shù)據(jù)庫(kù)都支持fetch size特性,例如mysql就不支持。mysql就像上面那種最壞的情況,總是一下就把1萬(wàn)條記錄完全取出來(lái),內(nèi)存消耗會(huì)非常非常驚人!這個(gè)情況就沒(méi)有什么好辦法了 hibernate.jdbc.batch_size:設(shè)定對(duì)數(shù)據(jù)庫(kù)進(jìn)行批量刪除,批量更新和批量插入的時(shí)候的批次大小,有點(diǎn)相當(dāng)于設(shè)置buffer緩沖區(qū)大小的意思。batch size越大,批量操作的向數(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秒!可見(jiàn)有多么大的性能提升!oracle數(shù)據(jù)庫(kù) batch size = 30 的時(shí)候比較合適。 這兩個(gè)選項(xiàng)非常重要,將嚴(yán)重影響hibernate的crud(create,read,update,delete)性能!,配置 c3p0數(shù)據(jù)庫(kù)連接池,c3p0連接池是hibernate推薦使用的連接池,若需要使用該連接池時(shí),需要將c3p0的jar包拷貝到 web-inf 的 lib 目錄下,pojo 類和數(shù)據(jù)庫(kù)的映射文件*.hbm.xml,pojo 類和關(guān)系數(shù)據(jù)庫(kù)之間的映射可以用一個(gè)xml文檔(xml document)來(lái)定義。映射按照pojo的定義來(lái)創(chuàng)建,而非表的定義。 通過(guò) pojo 類的數(shù)據(jù)庫(kù)映射文件,hibernate可以理解持久化類和數(shù)據(jù)表之間的對(duì)應(yīng)關(guān)系,也可以理解持久化類屬性與數(shù)據(jù)庫(kù)表列之間的對(duì)應(yīng)關(guān)系,映射文件示例,映射文件說(shuō)明,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等 查詢語(yǔ)句:query(用來(lái)放置查詢語(yǔ)句,便于對(duì)數(shù)據(jù)庫(kù)查詢的統(tǒng)一管理和優(yōu)化) 注意:一個(gè)hibernate-mapping中可以同時(shí)定義多個(gè)類。,hibernate-mapping,hibernate-mapping 是 hibernate 映射文件的根元素 schema (可選): 數(shù)據(jù)庫(kù)schema的名稱。 catalog (可選): 數(shù)據(jù)庫(kù)catalog的名稱。 default-cascade (可選 - 默認(rèn)為 none): 默認(rèn)的級(jí)聯(lián)風(fēng)格。 default-access (可選 - 默認(rèn)為 property): hibernate用來(lái)訪問(wèn)屬性的策略??梢酝ㄟ^(guò)實(shí)現(xiàn)propertyaccessor接口自定義。 default-lazy (可選 - 默認(rèn)為 true): 指定了未明確注明lazy屬性的java屬性和集合類, hibernate會(huì)采取什么樣的默認(rèn)加載風(fēng)格。 auto-import (可選 - 默認(rèn)為 true): 指定我們是否可以在查詢語(yǔ)言中使用非全限定的類名(僅限于本映射文件中的類)。 package (可選): 指定一個(gè)包前綴,如果在映射文檔中沒(méi)有指定全限定的類名, 就使用這個(gè)作為包名。,class,class:定義一個(gè)持久化類 name (可選): 持久化類(或者接口)的類名 table (可選 - 默認(rèn)是類的非全限定名): 對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名 discriminator-value (可選 - 默認(rèn)和類名一樣): 一個(gè)用于區(qū)分不同的子類的值,在多態(tài)行為時(shí)使用。它可以接受的值包括 null 和 not null。,主鍵-id,id:被映射的類必須定義對(duì)應(yīng)數(shù)據(jù)庫(kù)表主鍵字段。大多數(shù)類有一個(gè)javabean風(fēng)格的屬性, 為每一個(gè)實(shí)例包含唯一的標(biāo)識(shí)。 元素定義了該屬性到數(shù)據(jù)庫(kù)表主鍵字段的映射。 name (可選): 標(biāo)識(shí)持久化類屬性的名字。 type (可選): 標(biāo)識(shí)hibernate類型的名字。 column (可選 - 默認(rèn)為屬性名): 主鍵字段的名字。,主鍵生成策略generator,可選的子元素是一個(gè)java類的名字, 用來(lái)為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)。如果這個(gè)生成器實(shí)例需要某些配置值或者初始化參數(shù), 用元素來(lái)傳遞。,主鍵生成策略generator,所有的生成器都實(shí)現(xiàn)org.hibernate.id.identifiergenerator接口。某些應(yīng)用程序可以選擇提供他們自己特定的實(shí)現(xiàn)。當(dāng)然, hibernate提供了很多內(nèi)置的實(shí)現(xiàn):,推薦使用,基本類型property,property:為類定義了一個(gè)持久化的,javabean風(fēng)格的屬性 name: 屬性的名字,以小寫(xiě)字母開(kāi)頭。 column (可選 - 默認(rèn)為屬性名字): 對(duì)應(yīng)的數(shù)據(jù)庫(kù)字段名。 type (可選): 一個(gè)hibernate類型的名字。 lazy (可選 - 默認(rèn)為 false): 指定實(shí)例變量第一次被訪問(wèn)時(shí),這個(gè)屬性是否延遲抓?。╢etched lazily)。 unique (可選): 為該字段添加唯一的約束。 not-null (可選):為該字段添加非空約束。 optimistic-lock (可選 - 默認(rèn)為 true): 指定這個(gè)屬性在做更新時(shí)是否需要獲得樂(lè)觀鎖定(optimistic lock)。,hibernate內(nèi)置映射類型,hibernate內(nèi)置映射類型,映射集合屬性,集合屬性大致有兩種: 單純的集合屬性,如像list、set或數(shù)組等集合屬性 map結(jié)構(gòu)的集合屬性,每個(gè)屬性值都有對(duì)應(yīng)的key映射 集合映射的元素大致有如下幾種: list:用于映射list集合屬性 set:用于映射set集合屬性 map:用于映射map集合性 array:用于映射數(shù)組集合屬性 bag:用于映射無(wú)序集合 idbag:用于映射無(wú)序集合,但為集合增加邏輯次序,list集合映射,list是有序集合,因此持久化到數(shù)據(jù)庫(kù)時(shí)也必須增加一列來(lái)表示集合元素的次序??聪旅娴某志没?,該news類有個(gè)集合屬性:schools,該屬性對(duì)應(yīng)學(xué)校。而集合屬性只能以接口聲明,因此下面代碼中,schools的類型能是list,不能是arraylist,但該集合屬性必須使用實(shí)現(xiàn)類完成初始化。,list集合映射,在作相應(yīng)映射時(shí),list元素要求用list-index的子元素來(lái)映射有序集合的次序列。集合的屬性的值會(huì)存放有另外的表中,不可能與持久化類存儲(chǔ)在同一個(gè)表內(nèi)。因此須以外鍵關(guān)聯(lián),用key元素來(lái)映射該外鍵列。,list集合映射,測(cè)試程序:,list集合映射,生成的表及插入的數(shù)據(jù): person_table,list集合映射,生成的表及插入的數(shù)據(jù): school_table,set集合映射,set集合屬性映射與list非常相似,但因?yàn)閟et是無(wú)序的,不可重復(fù)的集合。因此set元素?zé)o須使用index元素來(lái)指定集合元素次序。映射文件與list相似,區(qū)別在于使用set元素時(shí),無(wú)須增加index列來(lái)保存集合的次序,set集合映射,測(cè)試程序,set集合映射,生成的表及插入的數(shù)據(jù): school_table,注:映射 set 集合屬性時(shí),如果 element 元素包括 not-null = “true” 屬性,則集合屬性表以關(guān)聯(lián)持久化類的外鍵和元素列作為聯(lián)合主鍵,否則該表沒(méi)有主鍵。但 list 集合屬性不會(huì),list 集合屬性總是以外鍵列和元素此序列作為聯(lián)合主鍵。,bag元素映射,bag元素既可以為list集合屬性映射,也可以為collection集合屬性映射。不管是哪種集合屬性,使用bag元素都將被映射成無(wú)序集合,而集合屬性對(duì)應(yīng)的表沒(méi)有主鍵。bag 元素只需要 key 元素來(lái)映射外鍵列,使用 element 元素來(lái)映射集合屬性的每個(gè)元素。,map集合屬性,map不僅需要映射屬性值,還需要映射屬性key。映射map集合屬性時(shí),同樣需要指定外鍵列,同時(shí)還必須指定map的key列。系統(tǒng)將以外鍵列和key列作為聯(lián)合主鍵。 map集合屬性使用map元素映射時(shí),該map元素需要key和map-key兩個(gè)子元素。其中key子元素用于映射外鍵列,而map-key子元素則用于映射map集合的key。而map-key和element元素都必須確定type屬性,集合屬性的性能的分析,對(duì)于集合屬性,通常推薦使用延遲加載策略。所謂延遲加載就是當(dāng)系統(tǒng)需要使用集合屬性時(shí)才從數(shù)據(jù)庫(kù)裝載關(guān)聯(lián)的數(shù)據(jù)。 hibernate對(duì)集合屬性默認(rèn)采用延遲加載,在某些特殊的情況下為set,,list,map等元素設(shè)置lazy=“false”屬性來(lái)取消延遲加載。 可將集合分成如下兩類: 有序集合:集合里的元素可以根據(jù)key或index訪問(wèn) 無(wú)序集合:集合里的元素中只能遍歷 有序集合擁有由 key 和 index 組成的聯(lián)合主鍵,集合的屬性在增加、刪除及修改中擁有較好的性能表現(xiàn) - 主鍵已經(jīng)被有效的索引,因此 hibernate 可以迅速的找到該行數(shù)據(jù)。 映射set集合屬性時(shí),如果element元素包括not-null=“true”屬性,則集合屬性表以關(guān)聯(lián)持久化類的外鍵和元素列作為聯(lián)合主鍵,否則該表沒(méi)有主鍵,因此性能較差。 在設(shè)計(jì)較好的hiberate domain object中,集合屬性通常都會(huì)增加inverse=“true”的屬性,此時(shí)集合端不再控制關(guān)聯(lián)關(guān)系。因此無(wú)需考慮集合的更新性能。,映射組件屬性,組件屬性的意思是持久化類的屬性既不是基本數(shù)據(jù)類型,也不是 string 字符串,而是某個(gè)組件變量,該組件屬性的類型可以是自定義類。,映射組件屬性,顯然無(wú)法直接用 property 映射 name 屬性。為了映射組件屬性, hibernate 提供了 component 元素。每個(gè) component 元素映射一個(gè)組件屬性,組件屬性必須指定該屬性的類型,component 元素中的 class 屬性用于確定組件的類型。,映射組件屬性,測(cè)試程序,映射組件屬性,生成的表及插入的數(shù)據(jù): worker_table,集合組件屬性映射,集合除了存放 string 字符串以外,還可以存放組件類型。實(shí)際上,更多情況下,集合組件存放的都是組件類型。,集合組件屬性映射,對(duì)于有集合屬性 pojo, 需要使用 set, list, bag 等集合元素來(lái)映射集合屬性。如果集合里的元素是普通字符串,則使用 element 映射集合元素即可。如果集合元素也是定義類,則需使用 composite-element 子元素來(lái)映射集合元素。composite-element 元素映射一個(gè)組件類型,因此需要 class 元素確定元素的類型,該元素還支持 property 的子元素來(lái)定義組件類型的子屬性,hibernate 的關(guān)聯(lián)關(guān)系映射,客觀世界中的對(duì)象很少有孤立存在的。關(guān)聯(lián)關(guān)系是面向?qū)ο蠓治?,面向?qū)ο笤O(shè)計(jì)最重要的知識(shí)。關(guān)聯(lián)關(guān)系大致有如下兩個(gè)分類: 單向關(guān)系:只需要單向訪問(wèn)關(guān)聯(lián)端 單向 1-1 單向 1-n(不推薦使用) 單向 n-1 單向 n-n 雙向關(guān)系:關(guān)聯(lián)的兩端可以相互訪問(wèn) 雙向 1-1 雙向 1-n 雙向 n-n,單向 n-1,單向 n-1 關(guān)聯(lián)只需從 n 的一端可以訪問(wèn) 1 的一端。模型:多個(gè)人(person)對(duì)應(yīng)同一個(gè)地址(address)。只需要從人實(shí)體端找到相應(yīng)的地址實(shí)體。無(wú)須關(guān)心從某個(gè)地址找到全部住戶。,單向 n-1,person 端增加了 address 屬性,該屬性不是一個(gè)普通的組件屬性,而是引用了另外一個(gè)持久化類,使用 many-to-one 元素映射 n-1 的持久化屬性。 many-to-one 元素的作用類似于 property 元素,用于映射持久化類的某個(gè)屬性,區(qū)別是改元素映射的是關(guān)聯(lián)持久化類。與 property 元素類似,many-to-one 元素也必須擁有 name 屬性,用于確定該屬性的名字,column 屬性確定外鍵列的列名.,單向 n-1,生成的表 person_table address_table,基于外鍵的單向 1-1,單向 1-1,pojo 與 n-1 沒(méi)有絲毫區(qū)別。 基于外鍵的單向 1-1 映射文件:只需要在原有的 many-to-one 元素添加 unique=“true”,用以表示 n 的一端必須唯一即可,n的一端增加了唯一約束, 即成為單向 1-1. person_table,基于主鍵的單向 1-1,基于主鍵關(guān)聯(lián)的持久化類不能擁有自己的主鍵生成器,它的主鍵由關(guān)聯(lián)類負(fù)責(zé)生成。增加one-to-one元素來(lái)映射關(guān)聯(lián)屬性,必須為one-to-one元素增加constrained=“true“屬性,表明該類的主鍵由關(guān)聯(lián)類生成。,基于主鍵的單向 1-1,person_table,單向的 1-n,單向 1-n 關(guān)聯(lián)的 pojo 需要使用集合屬性。因?yàn)橐坏囊欢诵枰L問(wèn) n 的一端,而 n 的一端將以集合的形式表現(xiàn)。 不推薦使用單向的 1-n 關(guān)聯(lián): 使用 1 的一端控制關(guān)聯(lián)關(guān)系時(shí),會(huì)額外多出 update 語(yǔ)句。 插入數(shù)據(jù)時(shí)無(wú)法同時(shí)插入外鍵列,因而無(wú)法為外鍵列添加非空約束,單向的 n-n,單向 n-n,pojo 與 1-n 沒(méi)有絲毫區(qū)別。 與映射集合屬性類似,必須為set,list等集合元素添加 key 子元素,用以映射關(guān)聯(lián)的外鍵列。與集合映射不同的是,建立 n-n 關(guān)聯(lián)時(shí),集合中的元素使用 many-to-many,而不是使用 element 子元素 n-n 的關(guān)聯(lián)必須使用連接表。,單向的 n-n 的測(cè)試程序,單向的 n-n,生成的表及插入的數(shù)據(jù): address_table person_table person_address_table,雙向 1-n,對(duì)于 1-n 的關(guān)聯(lián),hibernate 推薦使用雙向關(guān)聯(lián),而且不要讓 1 的一端控制關(guān)聯(lián)關(guān)系,而是使用 n 的一端控制關(guān)聯(lián)關(guān)系。 雙向 1-n 與 n-1 是完全相同的兩種情形,雙向 1-n,1 的一端需要使用集合屬性元素來(lái)映射關(guān)聯(lián)關(guān)系。集合屬性元素同樣需要增加 key 元素,還需要使用 one-to-many 元素來(lái)映射關(guān)聯(lián)屬性,雙向 1-n,n 的一端需要增加 many-to-one 元素來(lái)映射關(guān)聯(lián)屬性。,注意:在上面的配置文件中,兩個(gè)持久化類的配置文件都需要指定外鍵列的列名,此時(shí)不可以省略。因?yàn)椴皇褂眠B接表的1-n關(guān)聯(lián)的外鍵,而外鍵只保存在n一端的表中,如果兩邊指定的外鍵列名不同,將導(dǎo)致關(guān)聯(lián)映射出錯(cuò)。如果不指定外鍵列的列名,該列名由系統(tǒng)自動(dòng)生成,而系統(tǒng)很難保存自動(dòng)生成的兩個(gè)列名相同。,雙向 1-n,測(cè)試程序1:,雙向 1-n,生成的表及插入的數(shù)據(jù): customers_table orders_table,雙向 1-n,測(cè)試程序1產(chǎn)生的 sql 語(yǔ)句: 僅僅save(customer),并沒(méi)有save(order)但卻執(zhí)行了三條sql,由生成的sql語(yǔ)句可以知道,將用戶 tonggang 添加到customers表中的同時(shí)也將 order1及order2添加到orders表中!這是因?yàn)樵?customers.hbm.xml 映射配置中,set節(jié)點(diǎn)的設(shè)置了cascade=save-update,所以當(dāng)保存或更新customers的時(shí)候也會(huì)自動(dòng)保存相應(yīng)的orders對(duì)象!,雙向 1-n,注釋掉測(cè)試程序 1 中的訂單關(guān)聯(lián)用戶的代碼: 生成同樣的 sql 語(yǔ)句,同樣的數(shù)據(jù)表 customers_table 中插入的數(shù)據(jù) orders_table中插入的數(shù)據(jù) 在customers.hbm.xml的set節(jié)點(diǎn)中加了屬性 inverse=true,這句話的意思是將主控制權(quán)交出去:交給了orders,也就是用戶與訂單之間從屬關(guān)系主要是由orders對(duì)象來(lái)確定,也即訂單自己來(lái)決定它屬于哪個(gè)對(duì)象。所以在這里,將訂單關(guān)聯(lián)用戶的代碼注釋掉后,雖然后面用戶關(guān)聯(lián)了訂單,但因?yàn)橛脩粢呀?jīng)將主動(dòng)權(quán)交出,所以hibernate在save訂單的時(shí)候并不知道訂單是屬于哪個(gè)用戶,自然customers_id字段填空值。,雙向 1-n,將customers.hbm.xml中的 inverse=true 去掉 生成的 sql 語(yǔ)句: 數(shù)據(jù)庫(kù)表及插入的數(shù)據(jù)跟第一種情況相同 原來(lái)這種情況,hibernate是先將訂單持久化到表中,因?yàn)樽⑨屃擞唵侮P(guān)聯(lián)用戶的代碼,所以hibernate還是先插入空值,然后再根據(jù)用戶關(guān)聯(lián)訂單來(lái)更新orders表將 customers_id字段修改為正確的值!當(dāng)數(shù)據(jù)量很大的時(shí)候,這樣的操作會(huì)影響性能,同時(shí)不能將customers_id字段定義為not null。,雙向 1-n,將inverse=true加上,而用戶關(guān)聯(lián)訂單的注釋掉 生成的 sql 語(yǔ)句: 運(yùn)行結(jié)果是僅僅將 用戶添加到表中去了.關(guān)聯(lián)是僅僅減緩到訂單屬于哪個(gè)用戶,也就是關(guān)聯(lián)訂單的 customers_id 字段!但用戶類里,屬性 set orders = new hashset();初始是為空的,這樣雖然訂單關(guān)聯(lián)了用戶,但用戶對(duì)象內(nèi)的orders屬性還是為空,訂單并沒(méi)有產(chǎn)生,這樣hibernate在保存用戶的時(shí)候,判斷集合為空,不會(huì)去添加訂單.,inverse,只有集合標(biāo)記(set/map/list/array/bag)才有inverse屬性 在 hibernate 中,inverse 指定了關(guān)聯(lián)關(guān)系的方向。關(guān)聯(lián) 關(guān)系中 inverse = false 的為主動(dòng)方,由主動(dòng)方負(fù)責(zé)維護(hù) 關(guān)聯(lián)關(guān)系 在沒(méi)有設(shè)置 inverse=true 的情況下,父子兩邊都維護(hù)父子 關(guān)系 在 1-n 關(guān)系中,將 many 方設(shè)為主控方(inverse = false) 將有助于性能改善(如果要國(guó)家元首記住全國(guó)人民的名字,不 是太可能,但要讓全國(guó)人民知道國(guó)家元首,就容易的多) 在 1-n 關(guān)系中,若將 1 方設(shè)為主控方 會(huì)額外多出 update 語(yǔ)句。 插入數(shù)據(jù)時(shí)無(wú)法同時(shí)插入外鍵列,因而無(wú)法為外鍵列添加非空約束,cascade,只有關(guān)系標(biāo)記才有cascade屬性:many-to-one,one-to-one ,set(map, bag, idbag, list, array) + one-to-many(many-to-many) 級(jí)聯(lián)指的是當(dāng)主控方執(zhí)行操作時(shí),關(guān)聯(lián)對(duì)象(被動(dòng)方)是否 同步執(zhí)行同一操作。 pojo和它的關(guān)系屬性的關(guān)系就是“主控方 - 被動(dòng)方”的關(guān) 系,如果關(guān)系屬性是一個(gè)set,那么被動(dòng)方就是set中的每一 個(gè)元素。 一個(gè)操作因級(jí)聯(lián)cascade可能觸發(fā)多個(gè)關(guān)聯(lián)操作。前一個(gè)操作 叫“主控操作”,后一個(gè)操作叫“關(guān)聯(lián)操作”。 inverse 指的是關(guān)聯(lián)關(guān)系的控制方向,而cascade指的是層級(jí)之間的連鎖操作。,cascade,cascade屬性的可選值: all : 所有情況下均進(jìn)行關(guān)聯(lián)操作。 none:所有情況下均不進(jìn)行關(guān)聯(lián)操作。這是默認(rèn)值。 save-update:在執(zhí)行save/update/saveorupdate時(shí)進(jìn)行關(guān)聯(lián)操作。 delete:在執(zhí)行delete時(shí)進(jìn)行關(guān)聯(lián)操作 delete-orphan:表示刪除孤兒,delete-orphan在前者的基礎(chǔ)上增加了一點(diǎn),針對(duì)持久化對(duì)象,如果它和它所關(guān)聯(lián)的對(duì)象的引用關(guān)系不存在了,則進(jìn)行級(jí)聯(lián)刪除。 all-delete-orphan:包含all和delete-orphan的行為,雙向n-n關(guān)聯(lián),雙向n-n關(guān)聯(lián)需要兩端都使用集合屬性,兩端都增加對(duì)集合屬性的訪問(wèn)。雙向n-n關(guān)聯(lián)也必須使用連接表,雙向n-n關(guān)聯(lián),雙向n-n的關(guān)聯(lián)映射需要在兩邊增加集合元素,用于映射集合屬性。集合屬性應(yīng)增加key子元素用以映射外鍵列,集合元素里還應(yīng)增加many-to-many子元素關(guān)聯(lián)實(shí)體類,注意:在雙向n-n關(guān)聯(lián)的兩邊都需定連接表的表名及外鍵列的列名。兩個(gè)集合元素set的table元素的值必須指定,而且必須相同。set元素的兩個(gè)子元素:key和many-to-many都必須指定column屬性,其中,key和many-to-many分別指定本持久化類和關(guān)聯(lián)類在連接表中的外鍵列名,因 此兩邊的key與many-to-many的column屬性交叉相同。也就是說(shuō),一邊的set元素的key的cloumn值為a,many-to-many的column為b;則另一邊的set元素的key的column值b,many-to-many的column值為a.,雙向1-1關(guān)聯(lián),單向的1-1關(guān)聯(lián)有三種映射策略:基于主鍵,基于外鍵和使用連接表。雙向的1-1關(guān)聯(lián)同樣有這三種映射策略。 雙向的1-1關(guān)聯(lián)需要修改pojo類,讓兩邊都增加對(duì)關(guān)聯(lián)類的訪問(wèn),基于外鍵的雙向1-1關(guān)聯(lián),對(duì)于基于外鍵的1-1關(guān)聯(lián),其外鍵可以存放在任意一邊,在需要存放外鍵一端,增加many-to-one元素。為many-to-one元素增加unique=“true” 屬性來(lái)表示為1-1關(guān)聯(lián),并用name屬性來(lái)指定關(guān)聯(lián)屬性的屬性名。 另一端需要使用one-to-one元素,則該元素使用name屬性指定關(guān)聯(lián)的屬性名。為了讓系統(tǒng)懂得不再為本表增加一列,因此使用外鍵關(guān)聯(lián),用property-ref屬性來(lái)引用關(guān)聯(lián)類的主鍵。 property-ref:指定目標(biāo)實(shí)體的表中外鍵引用的列。如果引用表的外鍵不引用關(guān)系的”多”端的主鍵,可以使用p該屬性指定它應(yīng)用的列。這應(yīng)該只用于已有數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)設(shè)計(jì) - 在創(chuàng)建新的數(shù)據(jù)庫(kù)模式時(shí),外鍵總是應(yīng)該引用相關(guān)表的主鍵,基于外鍵的雙向1-1關(guān)聯(lián),基于外鍵的雙向1-1關(guān)聯(lián),生成的表 person_table address_table,基于主鍵的雙向1-1關(guān)聯(lián),基于主鍵的映射策略:指一端的主鍵生成器使用foreign略, 表明根據(jù)對(duì)方的主鍵來(lái)生成自己的主鍵,自己并不能獨(dú)立生 成主鍵。 任意一邊都可以采用foreign主鍵生成器,表明根據(jù)對(duì)方主鍵 生成自己的主鍵。 采用foreign主鍵生成器策略的一端增加one-to-one元素映射 關(guān)聯(lián)屬性,其one-to-one屬性還應(yīng)增加constrained=“true”屬 性;另一端增加one-to-one元素映射關(guān)聯(lián)屬性。 constrained(約束) :表明該類對(duì)應(yīng)的表對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,和被關(guān)聯(lián)的對(duì)象所對(duì)應(yīng)的數(shù)據(jù)庫(kù)表之間,通過(guò)一個(gè)外鍵引用對(duì)主鍵進(jìn)行約束。,基于主鍵的雙向1-1關(guān)聯(lián),基于主鍵的雙向1-1關(guān)聯(lián),生成的表 person_table address_table,繼承映射,對(duì)于面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言而言,繼承和多態(tài)是兩個(gè)最基本的概念。hibernate 的繼承映射可以理解持久化類之間的繼承關(guān)系。例如:人和學(xué)生之間的關(guān)系。學(xué)生繼承了人,可以認(rèn)為學(xué)生是一個(gè)特殊的人,如果對(duì)人進(jìn)行查詢,學(xué)生的實(shí)例也將被得到。,繼承映射,hibernate支持三種繼承映射策略: 每個(gè)具體類一張表(table per concrete class) 將域模型中的每一個(gè)實(shí)體對(duì)象映射到一個(gè)獨(dú)立的表中,也就是說(shuō)不用在關(guān)系開(kāi)數(shù)據(jù)模型中考慮域模型中的繼承關(guān)系和多態(tài)。 每個(gè)類分層結(jié)構(gòu)一張表(table per class hierarchy) 對(duì)于繼承關(guān)系中的子類使用同一個(gè)表,這就需要在數(shù)據(jù)庫(kù)表中增加額外的區(qū)分子類類型的字段。 每個(gè)子類一張表(table per subclass) 域模型中的每個(gè)類映射到一個(gè)表,通過(guò)關(guān)系數(shù)據(jù)模型中的外鍵來(lái)描述表之間的繼承關(guān)系。這也就相當(dāng)于按照域模型的結(jié)構(gòu)來(lái)建立數(shù)據(jù)庫(kù)中的表,并通過(guò)外鍵來(lái)建立表之間的繼承關(guān)系。,采用 subclass 元素的繼承映射,采用 subclass 元素的繼承映射可以實(shí)現(xiàn)對(duì)于繼承關(guān)系中的子類使用同一個(gè)表 在這種映射策略下,整個(gè)繼承樹(shù)的所有實(shí)例都保保存在同一個(gè)表內(nèi)。因?yàn)楦割惡妥宇惖膶?shí)例全部保存在同一個(gè)表中,因此需要在該表內(nèi)增加一列,使用該

溫馨提示

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