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

下載本文檔

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

文檔簡(jiǎn)介

1、2008 by Li Weigang. All rights reserved.J2EE架構(gòu)與程序設(shè)計(jì)架構(gòu)與程序設(shè)計(jì)主講:李偉剛西北工業(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映射實(shí)體對(duì)象l實(shí)體關(guān)聯(lián)l實(shí)體繼承2008 by Li Weigang. All rights reserved.第一節(jié)第一節(jié) 映射實(shí)體對(duì)象映射實(shí)體對(duì)象2008 by Li Weigang. All rights reserved.1 一個(gè)

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

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

4、ed.2 基本關(guān)系映射基本關(guān)系映射lJava persistence支持的映射機(jī)制從Java對(duì)象模型自動(dòng)映射到數(shù)據(jù)庫(kù)schema已有數(shù)據(jù)庫(kù)schema,根據(jù)schema自動(dòng)生成實(shí)體的Java代碼已有數(shù)據(jù)庫(kù)schema和Java類(lèi),通過(guò)注解或XML映射文件建立它們的映射關(guān)系l基本的Schema映射一個(gè)例子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的一個(gè)標(biāo)識(shí)每個(gè)entity bean必須有一個(gè)主鍵,且唯一主鍵可以映射到一個(gè)或多個(gè)數(shù)據(jù)成員必須是如下類(lèi)型中的一種lJava基本類(lèi)型(或其封

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

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

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

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

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

11、 Li Weigang. All rights reserved.3 主鍵主鍵l1 在主鍵類(lèi)中定義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)映射方式可處理的類(lèi)型:基本數(shù)據(jù)類(lèi)型及其封裝類(lèi)型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并非有價(jià)值的性能優(yōu)化手段l最佳實(shí)踐:一次性加載basic類(lèi)型的成員屬性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類(lèi)型的成員屬性可以映射成數(shù)據(jù)庫(kù)類(lèi)型:date, time, timestamp定義2008 by Li Weigang. All rights reserved.4 成員屬性映射成員屬性映射l4.4 Lob用于映射java.sql.Clob或java.sql.Blob類(lèi)型的大對(duì)象被標(biāo)

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

15、張數(shù)據(jù)庫(kù)表l 主表主鍵字段必須能夠和從表的一個(gè)或多個(gè)字段做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é) 實(shí)體關(guān)聯(lián)實(shí)體關(guān)聯(lián)2008 by Li Weigang. All rights reserved.1 七種實(shí)體關(guān)聯(lián)類(lèi)型七種實(shí)體關(guān)聯(lián)類(lèi)型l1.1 單向One-to-One關(guān)聯(lián)外

16、鍵2008 by Li Weigang. All rights reserved.1 七種實(shí)體關(guān)聯(lián)類(lèi)型七種實(shí)體關(guān)聯(lián)類(lèi)型通過(guò)OneToOne注解指明關(guān)聯(lián)類(lèi)型通過(guò)JoinColumn注解來(lái)定義映射要關(guān)聯(lián)的實(shí)體類(lèi),通常不需設(shè)置,persistence provider會(huì)根據(jù)成員屬性的類(lèi)型自動(dòng)設(shè)置級(jí)聯(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 七種實(shí)體關(guān)聯(lián)類(lèi)型七種實(shí)體關(guān)聯(lián)類(lèi)型例子用于關(guān)聯(lián)的外鍵字段2008 by Li Weigang. All rights res

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

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論