15-J2EE架構(gòu)與程序設(shè)計(O-R映射)_第1頁
15-J2EE架構(gòu)與程序設(shè)計(O-R映射)_第2頁
15-J2EE架構(gòu)與程序設(shè)計(O-R映射)_第3頁
15-J2EE架構(gòu)與程序設(shè)計(O-R映射)_第4頁
15-J2EE架構(gòu)與程序設(shè)計(O-R映射)_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、2008 by Li Weigang. All rights reserved.J2EE架構(gòu)與程序設(shè)計架構(gòu)與程序設(shè)計主講:李偉剛西北工業(yè)大學(xué)軟件與微電子學(xué)院2008 by Li Weigang. All rights reserved.第第15章章 O/R映射映射2008 by Li Weigang. All rights reserved.主要內(nèi)容主要內(nèi)容l映射實體對象l實體關(guān)聯(lián)l實體繼承2008 by Li Weigang. All rights reserved.第一節(jié)第一節(jié) 映射實體對象映射實體對象2008 by Li Weigang. All rights reserved.1 一個

2、一個Customer beanl Bean class是一個映射到關(guān)系數(shù)據(jù)庫的普通Java對象l有持有狀態(tài)的數(shù)據(jù)成員l通過setter和getter方法訪問數(shù)據(jù)成員的狀態(tài)l必須至少擁有一個無參數(shù)的構(gòu)造方法成為持久化實體類lJava persistence只要求兩段元數(shù)據(jù) 注解javax.persistence.Entity: 指明了應(yīng)將該類映射到數(shù)據(jù)庫 注解javax.persistence.Id: 指明了用作主鍵的成員變量l其余元數(shù)據(jù)在默認(rèn)情況下 類中其余成員變量映射到具有相同名稱和類型的數(shù)據(jù)庫字段上 默認(rèn)表名取bean class的非限定類名2008 by Li Weigang. All

3、rights reserved.1 一個一個Customer bean使用Id的方式,決定了聲明持久化成員變量的方式l將Id注解置于getter方法之上,則所有其他成員變量的聲明方式需與此一致l將Id注解置于類的成員變量之上,則所有其他成員變量的聲明方式需與此一致用XML映射文件聲明元數(shù)據(jù)l放在META-INF目錄下,或l用persistence.xml文件中的聲明2008 by Li Weigang. All rights reserved.1 一個一個Customer bean取值:PROPERTY or FIELD2008 by Li Weigang. All rights reserv

4、ed.2 基本關(guān)系映射基本關(guān)系映射lJava persistence支持的映射機(jī)制從Java對象模型自動映射到數(shù)據(jù)庫schema已有數(shù)據(jù)庫schema,根據(jù)schema自動生成實體的Java代碼已有數(shù)據(jù)庫schema和Java類,通過注解或XML映射文件建立它們的映射關(guān)系l基本的Schema映射一個例子2008 by Li Weigang. All rights reserved.2 基本關(guān)系映射基本關(guān)系映射2008 by Li Weigang. All rights reserved.2 基本關(guān)系映射基本關(guān)系映射Tableljavax.persistence.Table定義l用XML映射文件

5、表示2008 by Li Weigang. All rights reserved.2 基本關(guān)系映射基本關(guān)系映射Columnljavax.persistence.Column定義2008 by Li Weigang. All rights reserved.2 基本關(guān)系映射基本關(guān)系映射XML映射文件:orm_1_0.xsd2008 by Li Weigang. All rights reserved.3 主鍵主鍵l3.1 定義主鍵是給定entity bean的一個標(biāo)識每個entity bean必須有一個主鍵,且唯一主鍵可以映射到一個或多個數(shù)據(jù)成員必須是如下類型中的一種lJava基本類型(或其封

6、裝類)lJava.lang.Stringl由基本類型和(或)字符串組成的主鍵類2008 by Li Weigang. All rights reserved.3 主鍵主鍵l3.2 Id和GeneratedValuejavax.persistence.Id定義javax.persistence.GeneratedValue定義可以手工生成主鍵,也可以讓persistence provider生成,此時用GeneratedValue注解2008 by Li Weigang. All rights reserved.3 主鍵主鍵XML映射文件等價定義2008 by Li Weigang. All r

7、ights reserved.3 主鍵主鍵l 3.3 表生成器將當(dāng)前主鍵的值單獨保存到一個數(shù)據(jù)庫表中,每次從指定的表中查詢來獲得主鍵用javax.persistence.TableGenerator注解定義表生成器該注解用于ENTITY類、成員方法或代表主鍵的成員變量一旦在實體中標(biāo)記,它不僅可以在本實體中使用,也可以在其他的實體中引用。它的作用范圍是整個persist unit配置的實體類中這種方法生成主鍵的策略可以適用于任何的數(shù)據(jù)庫,不必?fù)?dān)心不同數(shù)據(jù)庫不兼容造成的問題2008 by Li Weigang. All rights reserved.3 主鍵主鍵javax.persistence

8、.TableGenerator定義與GeneratedValue.generator( )屬性取值一致生成器表的定義信息表生成器中的列名,該列用來存放其它表的主鍵鍵名持有主鍵用的計數(shù)器值的字段用于匹配生成的主鍵,值為主鍵鍵名查詢時,計數(shù)器指針的遞增數(shù)。用于緩存ID,提高效率2008 by Li Weigang. All rights reserved.3 主鍵主鍵2008 by Li Weigang. All rights reserved.3 主鍵主鍵l3.4 Sequence生成器許多數(shù)據(jù)庫內(nèi)建序列號生成器,可按次序生成IDjavax.persistence.SequenceGenerat

9、or定義使用數(shù)據(jù)庫中的sequence表的名字Sequence初值2008 by Li Weigang. All rights reserved.3 主鍵主鍵2008 by Li Weigang. All rights reserved.3 主鍵主鍵l 3.5 主鍵類和復(fù)合鍵主鍵類滿足l必須是可序列化的l必須具有公有的無參構(gòu)造方法l必須實現(xiàn)equals()和hashCode()方法不支持自動生成功能3.5.1 javax.persistence.IdClass注解l主鍵類不是在bean class內(nèi)部使用,而是在根據(jù)主鍵查找實體時,被bean class用來與entity manager交互l

10、是一個類級別的注解2008 by Li Weigang. All rights reserved.3 主鍵主鍵l一個主鍵類:CustomerPK.javal使用注解IdClass2008 by Li Weigang. All rights reserved.3 主鍵主鍵3.5.2 javax.persistence.EmbeddedId注解l主鍵類直接嵌入到bean class內(nèi)部使用l將主鍵類的成員屬性映射到表中的字段上的兩種方法 在主鍵類中定義Column映射 直接在bean class上使用AttributeOverrides要映射的內(nèi)嵌類的成員屬性名成員屬性所要映射的字段2008 by

11、 Li Weigang. All rights reserved.3 主鍵主鍵l1 在主鍵類中定義Column映射2008 by Li Weigang. All rights reserved.3 主鍵主鍵l2 直接在bean class上使用AttributeOverrides2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.1 Transient用于不打算持久化的成員屬性2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.2 Basic & FetchTyp

12、e用于持久化成員屬性的映射,是成員屬性的默認(rèn)映射方式可處理的類型:基本數(shù)據(jù)類型及其封裝類型ljava.lang.String, byte, Byte, char, Character, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time , java.sql.Timestamp 使用fetch屬性確定“延遲加載”特性l并非有價值的性能優(yōu)化手段l最佳實踐:一次性加載basic類型的成員屬性2008 by Li Weigang. Al

13、l rights reserved.4 成員屬性映射成員屬性映射Basic的定義l例子延遲加載特性字段可空?2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.3 Temporal用于映射java.util.Date或java.util.Calendar類型的成員屬性可以映射成數(shù)據(jù)庫類型:date, time, timestamp定義2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.4 Lob用于映射java.sql.Clob或java.sql.Blob類型的大對象被標(biāo)

14、注為Lob的成員屬性被持久化到lBlob,如果其Java類型是byte, Byte, 或java.io.SerializablelClob,如果其Java類型是char, Character, 或java.lang.String定義2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.5 Enumerated用于映射Java枚舉類型的成員屬性定義例子映射成integer類型映射成varchar類型2008 by Li Weigang. All rights reserved.5 多表映射多表映射l 將一個entity bean映射到多

15、張數(shù)據(jù)庫表l 主表主鍵字段必須能夠和從表的一個或多個字段做join操作l 使用SecondaryTable定義定義用于同主表做join操作的字段,缺省值為與主表主鍵名相同當(dāng)前表(從表)的主鍵字段名做join操作的目標(biāo)表的主鍵字段2008 by Li Weigang. All rights reserved.5 多表映射多表映射l例子2008 by Li Weigang. All rights reserved.第二節(jié)第二節(jié) 實體關(guān)聯(lián)實體關(guān)聯(lián)2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.1 單向One-to-One關(guān)聯(lián)外

16、鍵2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型通過OneToOne注解指明關(guān)聯(lián)類型通過JoinColumn注解來定義映射要關(guān)聯(lián)的實體類,通常不需設(shè)置,persistence provider會根據(jù)成員屬性的類型自動設(shè)置級聯(lián)方式延遲加載關(guān)聯(lián)的兩端是否可以為空用于關(guān)聯(lián)的外鍵字段若指向被關(guān)聯(lián)表的非主鍵字段,則需定義用于雙向關(guān)聯(lián)2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型例子用于關(guān)聯(lián)的外鍵字段2008 by Li Weigang. All rights res

17、erved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.2 雙向One-to-One關(guān)聯(lián)可以使用與單向one-to-one關(guān)聯(lián)相同的數(shù)據(jù)庫Schema來映射雙向one-to-one關(guān)聯(lián)在關(guān)系數(shù)據(jù)庫模型中,關(guān)系沒有方向例子2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型lCustomer bean classlCreditCard bean class用于將該關(guān)聯(lián)關(guān)系映射到數(shù)據(jù)庫表所需的信息是在Customer中定義的Inverse side反轉(zhuǎn)端Owning side支配端2008 by Li Weigang. All righ

18、ts reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l設(shè)置雙向關(guān)聯(lián)重置關(guān)聯(lián)關(guān)系由于cascade()屬性設(shè)置為ALL,所以Customer被持久化時,與之關(guān)聯(lián)的CreditCard也會相應(yīng)地被自動保存起來需要將支配端的關(guān)聯(lián)屬性設(shè)置為null后,才能重置關(guān)聯(lián)關(guān)系2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.3 單向One-to-Many關(guān)聯(lián)數(shù)據(jù)庫schema與實體關(guān)系的指向是相反的OneToMany注解2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)

19、類型Customer實體類使用Java泛型指明集合中對象,使得persistence provider知道正在將Customer實體關(guān)聯(lián)于哪種類型的集合變量。不使用泛型,必須用targetEntity屬性指明PHONE表中的CUSTOMER_ID字段2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Phone實體類不包含任何指向Customer的關(guān)系型成員屬性2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型使用關(guān)聯(lián)表2008 by Li Weigang. All

20、 rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型lJoinTable注解定義的外鍵,映射到關(guān)聯(lián)關(guān)系中作為支配端一方的主鍵映射到反轉(zhuǎn)端2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l使用JoinTable注解2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.4 單向Many-to-One關(guān)聯(lián)ManyToOne注解2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Crui

21、se bean classShip bean class不需要定義任何指向Cruise的關(guān)聯(lián)關(guān)系2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.5 雙向Many-to-One關(guān)聯(lián)(雙向One-to-Many)實體的關(guān)聯(lián)關(guān)系與數(shù)據(jù)庫實現(xiàn)方式無需相同Java persistence規(guī)定many-to-one的集合一端必須是支配端支配端2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Reservation bean class2008 by Li Weigan

22、g. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Cruise bean class映射到Reservation bean的cruise成員屬性2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.6 單向Many-to-Many關(guān)聯(lián)2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Reservation bean classCabin bean class沒有回指Reservation的引用2008 by Li Weigang.

23、 All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型l1.7 雙向Many-to-Many關(guān)聯(lián)2008 by Li Weigang. All rights reserved.1 七種實體關(guān)聯(lián)類型七種實體關(guān)聯(lián)類型Reservation bean classCabin bean class支配端反轉(zhuǎn)端2008 by Li Weigang. All rights reserved.2 級聯(lián)級聯(lián)l通過entity manager操作entity bean實例時,同樣的操作會自動地作用于該實體所擁有的任何關(guān)系型成員屬性上,這種行為稱為“級聯(lián)級聯(lián)”l級聯(lián)的定義2008 by Li

24、 Weigang. All rights reserved.2 級聯(lián)級聯(lián)PERSISTl按照關(guān)聯(lián)關(guān)系的指向,持久化源實體對象,其相應(yīng)的成員屬性若是另一個實體對象,則它也同時被持久化MERGElMerge是一種將游離對象的狀態(tài)同步到持久化存儲設(shè)備中的過程l使用MERGE級聯(lián),無需為關(guān)聯(lián)實體調(diào)用EntityManager.merge()方法l如果為關(guān)聯(lián)添加了任何新的實例,而實例又沒有在數(shù)據(jù)庫中創(chuàng)建,則調(diào)用merge()方法后,它被自動保存到數(shù)據(jù)庫中2008 by Li Weigang. All rights reserved.2 級聯(lián)級聯(lián)REMOVEl刪除實體,則自動刪除其級聯(lián)實體REFRESHl

25、與MERGE相似l區(qū)別:刷新不會將對象實例中的變更信息更新到數(shù)據(jù)庫,它根據(jù)數(shù)據(jù)庫來刷新對象實例的狀態(tài)ALLl取所有策略的組合l使用級聯(lián)的策略級聯(lián)僅僅是一種減少EntityManager API調(diào)用的次數(shù)的便捷工具而已如果不確定如何使用實體,則關(guān)閉級聯(lián)功能2008 by Li Weigang. All rights reserved.第三節(jié)第三節(jié) 實體繼承實體繼承2008 by Li Weigang. All rights reserved.1 繼承的映射方式繼承的映射方式l為了將一個繼承層次映射到數(shù)據(jù)庫,Java persistence提供了三種方法每個類層次對應(yīng)一張表l一張表中包含了整個層次

26、結(jié)構(gòu)中每個類的全部成員屬性每個具體類對應(yīng)一張表l每個類有一張專門的表,包含了它的全部成員屬性,以及映射到此表的父類的成員屬性每個子類對應(yīng)一張表l每個類有它自己的表,每張表只包含當(dāng)前類中定義的成員屬性,不包含任何父類和子類的成員屬性2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表l映射關(guān)系用于標(biāo)識該行記錄對應(yīng)哪個實體2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表l javax.persistence.Inheritance注解l javax.p

27、ersistence.DiscriminatorColumn注解Discriminator字段名稱Discriminator字段類型:STRING, CHAR或INTEGER2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表ljavax.persistence.DiscriminatorValue注解缺省值是entity bean類名2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表l實現(xiàn)Person bean class2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表Customer bean classEmployee bean class2008 by Li Weigang. All rights reserved.2 每個類層次對應(yīng)一張表每個類層次對應(yīng)一張表l分析優(yōu)點l容易實現(xiàn)l性能最佳缺點l所有代表子類成員屬性的字段都必須允許為空l由于代表子類成員屬性的字段有可能沒被用到,所以不遵循數(shù)

溫馨提示

  • 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

提交評論