版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、現(xiàn)在EJB3 實(shí)體Bean 是純粹的 POJO.實(shí)際上這表達(dá)了和 Hibernate 持久化實(shí)體對象同樣的概念.它們的都通過JDK5.0 注解來定義(EJB3 規(guī)范已經(jīng)定義了對應(yīng)的XML 描述語法).注解分為兩個部分,分別是邏輯注解和物理注解, 通過邏輯注解可以描述對象模型,類之間的關(guān)系等等, 而物理等等.注解則描述了物理的 schema,表,列,索引下面在代碼中將混合使用這兩種類型的注解.EJB3 注解的 API 定義在 javax.persistence.*包里面.大部分和 JDK5 兼容的 IDE(象 Eclipse,elliJ IDEA 和Netbeans 等等)都提供了注解接口和屬性
2、的自動完成功能.(這些不需要 IDE 提供特別的 EJB3 支持模塊,因?yàn)?EJB3注解是標(biāo)準(zhǔn)的 JDK5 注解)請閱讀 Js EJB 3.0 指南或者直接閱讀 HibernateAnnoions 測試代碼以獲取的可運(yùn)行實(shí)例.Hibernate Annoions 提供的大部分單元測試代碼都演示了實(shí)際的例子,是一個獲取靈感的好地方.每一個持久化 POJO 類都是一個實(shí)體 bean,這可以通過在類的定義中使用Entity 注解來進(jìn)行Entity:public class Flight implements Serializable Long id;Idpublic Long getId() ret
3、urn id; public void setId(Long id) this.id = id; 通過Entity 注解將一個類為一個實(shí)體 bean(即一個持久化 POJO 類),Id 注解則了該實(shí)體 bean 的標(biāo)識屬性.其他的定義是隱式的.這種以隱式在新的 EJ3 規(guī)范中處于非常重要的位置,和以前的版本相比有了質(zhì)的飛躍.為主體,以顯式為例外的配置方式在上面這段代碼中:Flight 類到Flight 表,并使用 id 列作為主鍵列.在對一個類進(jìn)行注解時,你可以選擇對它的的屬性或者方法進(jìn)行注解,根據(jù)你的選擇,Hibernate 的field 或property.類型分別為EJ3 規(guī)范要求在需要
4、的元素上進(jìn)行注解,例如,如果類型為property 就要在 getter 方法上進(jìn)行注解,如果種類型.類型為 field 就要在字段上進(jìn)行注解.應(yīng)該盡量避免混合使用這兩Hibernate 根據(jù)Id 或 EmbeddedId 的位置來判斷類型.Table 是類一級的注解,通過Table 注解可以為實(shí)體 bean字.指定表(table),目錄(catalog)和 schema 的名如果沒有定義Table,那么系統(tǒng)自動使用默認(rèn)值:實(shí)體的短類名(不附帶包名).Entity Table(name=tbl_sky)public class Sky implements Serializable .Tabl
5、e 元素包括了一個 schema和一個 catalog 屬性,如果需要可以指定相應(yīng)的值.結(jié)合使用UniqueConstra注解可以定義表的唯一約束(unique constra)(對于綁定到單列的唯一約束,請參考Column 注解)Table(name=tbl_sky,uniqueConstras = UniqueConstra(columnNames=month, day)上面這個例子中,在 month 和 day 這兩個字段上定義唯一約束.注意columnNames 數(shù)組中的值指的是邏輯列名.Hibernate 在 NamingStrategy 的實(shí)現(xiàn)中定義了邏輯列名.默認(rèn)的 EJB3 命
6、名策略將物理字段名當(dāng)作邏輯字段名來使用.注意該字段名和它對應(yīng)的屬性名可能不同(如果字段名是顯式指定的話).除非你重寫了 NamingStrategy,否則不用擔(dān)心這些區(qū)別.你可以在實(shí)體 bean 中使用Ver注解,通過這種方式可添加對樂觀鎖定的支持:Entitypublic class Flight implements Serializable .Ve Column(name=OPTLOCK)publiceger getVer() . 上面這個例子中,ver到 OPTLOCK 列,屬性將entity manager 使用該字段來檢測更新策略).(防止更新丟失 請參考mit-wins根據(jù) EJ
7、B3 規(guī)范,ver列可以是numeric 類型(方式)也可以是timest類型.Hibernate 支持任何自定義類型,只要該類型實(shí)現(xiàn)了 UserVerType.Every non sic non transient property (field or method) of an entity bean is considered persistent, unless you annoe it asTransient. Noving an annoion for yourproperty is equivalent to the appropriate Basic annoion. The
8、Basic annoion allows you todeclare the fetching strategy for a property:實(shí)體bean 中所有的非 sic 非transient 的屬性都可以被持久化, HYPERLINK mailto:除非你將其注解為Transient.所有沒有定義注解的屬性等價于在其上面添加了 除非你將其注解為Transient.所有沒有定義注解的屬性等價于在其上面添加了Basic 注解.通過 Basic 注解可以屬性的獲取策略(fetch strategy):public transientcounter; /transient propertypr
9、ivate Stringname; /persistent propertyTransient String getLengtheter() . /transient propertyString getName() . / persistent propertyBasicgetLength() . / persistent propertyBasic(fetch = FetchType.LAZY)Stringment() . / persistent propertyTemporal(TemporalType.TIME)java.util.Date getDepartureTime() .
10、/ persistent propertyEnumerated(STRING)Starred getNote() . /enum persisted as String in database上面這個例子中,counter 是一個 transient 的字段,lengtheter 的 getter 方法被注解為Transient,entity manager 將忽略這些字段和屬性.而name,length,name這幾個屬性則是被定義為可持久化和可獲取的.對于簡單屬性來說,默認(rèn)的獲取方式是即時獲取(early fetch).當(dāng)一個實(shí)體 Bean 的實(shí)例被創(chuàng)建時,Hibernate 會將這些屬性
11、的值從數(shù)據(jù)庫中提取出來,保存到 Bean 的屬性里.與即時獲取相對應(yīng)的是延遲獲取(lazy fetch).如果一個屬性的獲取方式是延遲獲取(比如上面例子中的ment 屬性),Hibernate 在創(chuàng)建一個實(shí)體 Bean 的實(shí)例時,不會即時將這個屬性的值從數(shù)據(jù)庫中讀出.只有在該實(shí)體 Bean 的這個屬性第一次被調(diào)用時,Hibernate 才會去獲取對應(yīng)的值. 通常你不需要對簡單屬性設(shè)置延遲獲取(lazy simple property),千萬不要和延遲關(guān)聯(lián)獲取(lazy assotion fetch)了(譯注:這里指lazy simple property 和 lazy assotion fet
12、ch了).為了啟用屬性級的延遲獲取,你的類必須經(jīng)過特殊處理(instrumented):字節(jié)碼將被織入原始類中來實(shí)現(xiàn)延遲獲取功能,詳情參考 Hibernate 參考文檔.如果不對類文件進(jìn)行字節(jié)碼特殊處理,那么屬性級的延遲獲取將被忽略.的替代方案是使用 EJB-QL 或者 Criteria 查詢的投影(projection)功能.Hibernate 和 EJB3 都支持所有基本類型的屬性.這些基本類型包括所有的 Java 基本類型,及其各自的 wrapper 類和 serializable 類.Hibernate Annoions 還支持將內(nèi)置的枚舉類型到一個順序列(保存了相應(yīng)的序列值)或一個字
13、符串類型的列(保存相應(yīng)的字符串).默認(rèn)是保存枚舉的序列值,但是你可以通過Enumerated 注解來進(jìn)行調(diào)整(見上面例子中的 note 屬性).在的 Java API 中并沒有定義時間精度(temporal preci).因此處理時間類型數(shù)據(jù)時,你還需要定義將其在數(shù)據(jù)庫中所預(yù)期的精度.在數(shù)據(jù)庫中,表示時間類型的數(shù)據(jù)有 DATE, TIME,和 TIMEST三種精度(即單純的日期,時間,或者兩者兼?zhèn)?.可使用Temporal 注解來調(diào)整精度.Lob 注解表示屬性將被持久化為 Blob 或者 Clob 類型,具體取決于屬性的類型,java.sql.Clob, Character, char 和ja
14、va.lang.String 這些類型的屬性都被持久化為 Clob 類型,而java.sql.Blob,Byte, byte 和serializable 類型則被持久化為 Blob 類型.Lobpublic String getFullText() return fullText;Lobpublic byte getFullCode() return fullCode;如果某個屬性實(shí)現(xiàn)了 java.io.Serializable 同時也不是基本類型,并且沒有在該屬性上使用Lob 注解,那么 Hibernate 將使用自帶的 serializable 類型.使用 Column 注解可將屬性到列.
15、使用該注解來覆蓋默認(rèn)值(關(guān)于默認(rèn)值請參考 EJB3 規(guī)范).在屬性級使用該注解的方式如下:不進(jìn)行注解和和和和和Basic 一起使用Ver一起使用Lob 一起使用Temporal 一起使用.hibernate.annoions.CollectionOfElements 一起使用(只針對 Hibernate )Entitypublic class Flight implements Serializable .Column(updatable = false, name = flight_name, nullable = false, length=50) public String getNam
16、e() . 在上面這個例子中,name 屬性到 flight_name 列.該字段不允許為空,長度為 50,并且是不可更新的(也就是屬性值是不變的).上面這些注解可以被應(yīng)用到正規(guī)屬性上例如Id 或Ver屬性Column(name=columnName; unique() default false; nullable() default true; insertable() default true; updatable() default true;String columnDefinition() default ; String table() default ;length() def
17、ault 255;preci() default 0; / decimal preciscale() default 0; / decimal scalename 可選,列名(默認(rèn)值是屬性名)unique 可選,是否在該列上設(shè)置唯一約束(默認(rèn)值 false)nullable 可選,是否設(shè)置該列的值可以為空(默認(rèn)值 false)insertable 可選,該列是否作為生成的 insert 語句中的一個列(默認(rèn)值 true)updatable 可選,該列是否作為生成的 update 語句中的一個列(默認(rèn)值 true)columnDefinition 可選: 為這個特定列覆蓋 SQL DDL 片段
18、(這可能導(dǎo)致無法在不同數(shù)據(jù)庫間移植)table 可選,定義對應(yīng)的表(默認(rèn)為主表)length 可選,列長度(默認(rèn)值 255)preci可選,列十進(jìn)制精度(decimal preci)(默認(rèn)值 0)scale 可選,如果列十進(jìn)制數(shù)值范圍(decimal scale)可用,在此設(shè)置(默認(rèn)值 0)組件(embedded component),甚至覆蓋該實(shí)體中原在實(shí)體中可以定義一個有的列.組件類必須在類一級定義Embeddable 注解. 在特定的實(shí)體的關(guān)聯(lián)屬性上使用Embedded 和 AttributeOverride 注解可以覆蓋該屬性對應(yīng)的對象的列:Entity public classimp
19、lements Serializable / Persistent component using defaults Address homeAddress;Embedded AttributeOverrides( AttributeOverride(name=iso2, column = Column(name=bornIso2) ),AttributeOverride(name=name, Column(name=bornCountryName) )column= )Country bornIn;.Embeddablepublic class Address implements Seri
20、alizable String city;Country nationality; /no overriding hereEmbeddablepublic class Country implements Serializable private String iso2;Column(name=countryName) private String name;public String getIso2() return iso2; public void setIso2(String iso2) this.iso2 = iso2; public String getName() return
21、name; public void setName(String name) = name; .對象繼承其所屬實(shí)體中定義的(注意:這可以通過使用 Hibernate 提供的Ac linkend=entity-hibspec /).類型sType 注解來覆蓋原有值)(請參考在上面的例子中,實(shí)體 bean分別是homeAddress 和 bornIn.有兩個組件屬性,可以看到 homeAddress 屬性并沒有注解.但是 Hibernate 自動檢測其對應(yīng)的 Address 類中的Embeddable 注解,并將其看作一個持久化組件.對于Country 中已則使用Embedde
22、d 和AttributeOverride的屬性,注解來覆蓋原來的列名.正如你所看到的, Address 對象中還內(nèi)嵌了 Country 對象,這里和homeAddress 一樣使用了 Hibernate 和 EJB3 自動檢測機(jī)制.目前 EJB3 規(guī)范還不支持覆蓋多層嵌套(即的列.對象中還包括其他對象)不過 Hibernate 通過在表達(dá)式中使用.符號表達(dá)式提供了對此特征的支持.Embedded AttributeOverrides( AttributeOverride(name=city, column = Column(name=fld_city) )AttributeOverride(n
23、ame=nationality.iso2, Column(name=nat_Iso2) ),AttributeOverride(name=, Column(name=nat_CountryName) )/nationality columns in homeAddress are overridden )Address homeAddress;column=column=Hibernate 注解支持很多 EJB3 規(guī)范中沒有明確定義的特性.例如,可以在對象上添加 MappedSuperclass 注解,這樣可以將其父類的屬性持久(查閱MappedSupercla
24、ss).Hibernate 現(xiàn)在支持在*ToMany).對象中使用關(guān)聯(lián)注解( 如 *ToOne 和而 EJB3 規(guī)范尚不支持這樣的用法.你可以使用 Asso關(guān)聯(lián)列.tionOverride 注解來覆寫在同一個實(shí)體中使用兩個同類型的嵌入對象, 其默認(rèn)列名是無效的:至少要對其中一個進(jìn)行明確.Hibernate 在這方面走在了 EJB3 規(guī)范的前面,Hibernate 提供了 NamingStrategy, 在使用 Hibernate 時, 通過 NamingStrategy 你可以對默認(rèn)的機(jī)制進(jìn)行擴(kuò)展.ponentSafeNamingStrategy 在默認(rèn)的EJB3NamingStrategy
25、上進(jìn)行了小小的,允許在同一實(shí)體中使用兩個同類型的嵌入對象而無須額外的.如果某屬性沒有注解,該屬性將遵守下面的規(guī)則:如果屬性為單一類型,則為Basic否則,如果屬性對應(yīng)的類型定義了Embeddable 注解,則否則,如果屬性對應(yīng)的類型實(shí)現(xiàn)了 Serializable,為Embedded則屬性被為Basic 并在一個列中保存該對象的 serialized 版本否則,如果該屬性的類型為 java.sql.Clob 或 java.sql.Blob,則作為Lob 并的 LobType.到適當(dāng)xreflabel=Mapidentifiroperties使用Id 注解可以將實(shí)體 bean 中的某個屬性定義為
26、標(biāo)識符(identifier).該屬性的值可以通過應(yīng)用自身進(jìn)行設(shè)置,也可以通過 Hiberante 生成( 使用 GeneratedValue 注解可以定義該標(biāo)識符的生成策略:).AUTO - 可以是 identity column 類型,或者 sequence 類型或者 table 類型,取決于不同的底層數(shù)據(jù)庫.TABLE - 使用表保存id 值 IDENTITY - identity column SEQUENCE - sequence和 EJB3 規(guī)范相比,Hibernate 提供了的 id.查閱 .下面的例子展示了使用 SEQ_STORE 配置的 sequenceId generato
27、r=SEQ_STORE)GeneratedValue(strategy=GenerationType.SEQUENCE,publiceger getId() . 下面這個例子使用的是 identityId GeneratedValue(strategy=GenerationType.IDENTITY) public Long getId() . AUTO適用于可移植的應(yīng)用(在多個 DB 間切換).多個Id 可以共享同一個 identifier以了.,只要把 generator 屬性設(shè)成相同的值就可通過SequenceGenerator 和TableGenerator,你可以配置不同的 iden
28、tifier.每一個identifier一級(class level).類一級的器.應(yīng)用級的都有自己的適用范圍,可以是應(yīng)用級(application level)和類在外部是不可見的,而且類一級的可以覆蓋應(yīng)用級的生成則定義在 XML 級(請參閱):/and the annoion equivalent javax.persistence.TableGenerator(name=EMP_GEN, table=GENERATOR_TABLE,pkColumnName = key, valueColumnName = hi pkColumnValue=EMP, allocationSize=20)/
29、and the annoion equivalentjavax.persistenequenceGenerator(name=SEQ_GEN,sequenceName=my_sequence, allocationSize=20)如果 JPA XML( 如 META-INF/orm.xml) 用于定義EMP_GEN, 那么該文件中定義的和 SEQ_GEN 都是應(yīng)用級的.EMP_GEN 定義了一個使用 hilo 算法(max_lo 為 20)的 id(該將 id 的信息存在數(shù)據(jù)庫的某個表中.).id 的 hi 值保存在 GENERATOR_TABLE 中.在該表中 pkColumnNamekey
30、等價于 pkColumnValue EMP,而valueColumnName hi中 SEQ_GEN 定義了一個 sequence的是下一個要使用的最大值.,其使用名為 my_sequence 的 sequence.該hilo 算法基于 sequence,該 sequence 分配的大小為 20.注意,現(xiàn)在這個版本還不能處理 sequence的 initialValue 屬性.默認(rèn)分配的大小為 50,因此如果你打算使用 sequence,并且希望每次都重新獲取新的值,務(wù)必將分配的大小設(shè)置為 1.EJB3.0 規(guī)范已經(jīng)不再支持 Package 級別的定義. 但是你仍然可以在包上使用Generic
31、Generator注解(參考linkend=entity-hibspec-identifier /).SEQ_GEN 則定義了一個 sequence其對應(yīng)的 sequence 名為 my_sequence.,注意目前Hibernate Annoions 還不支持 sequence initialValue 和 allocationSize 參數(shù).中的下面這個例子展示了定義在類范圍(class scope)的 sequence:Entity javax.persistenequenceGenerator(name=SEQ_STORE,sequenceName=my_sequence)public
32、 class Store implements Serializable privaong id;Id generator=SEQ_STORE)GeneratedValue(strategy=GenerationType.SEQUENCE,public Long getId() return id; 在這個例子中,Store 類使用名為 my_sequence 的 sequence,并且 SEQ_STORE對于其他類是不可見的.注意在.hibernate.test.metadata.id 包下的測試代碼有演示 HibernateAnnoions 用法的例子.下面是定義組合主鍵的幾種語法:將組件
33、類注解為Embeddable,并將組件的屬性注解為Id將組件的屬性注解為EmbeddedId將類注解為IdClass,并將該實(shí)體中所有屬于主鍵的屬性都注解為Id對于 EJB2 的開發(fā)來說就是一個嶄新的用法.來說 IdClass 是很常見的,但是對于 Hibernate 的用戶組合主鍵類對應(yīng)了一個實(shí)體類中的多個字段或?qū)傩? 而且主鍵類中用于定義主鍵的字段或?qū)傩院蛯?shí)體類中對應(yīng)的字段或?qū)傩栽陬愋蜕媳仨氁恢?下面例子:Entity看一個IdClass(Footballk.class)public class Footballer /part of the id keyId public String
34、getname() returnname;public void setname(Stringname) =name;/part of the id keyId public String getLastname() return lastname;public void setLastname(String lastname) this.lastname = lastname;public String getClub() return club;public void setClub(String club) this.club = club;/appropriate
35、equals() and hashCode() implemenionEmbeddable public class Footballk implements Serializable /same name and type as in Footballerpublic String getname() returnname;public void setname(Stringname) =name;/same name and type as in Footballer public String getLastname() return lastname;public
36、void setLastname(String lastname) this.lastname = lastname;/appropriate equals() and hashCode() implemenion如上, IdClass 指應(yīng)的主鍵類.Hibernate 支持在組合標(biāo)識符中定義關(guān)聯(lián)(就像使用普通的注解一樣),而 EJB3 規(guī)范并不支持此類用法.EntityAssotionOverride(name=id.channel,joinColumns=JoinColumn(name=chan_id) ) public class TvMagazin EmbeddedId public
37、TvMagazinPk id; Temporal(TemporalType.TIME) Date time;Embeddablepublic class TvMagazinPk implements Serializable ManyToOnepublic Channel channel; public String name; ManyToOnepublic Presentresenter;EJB3 支持三種類型的繼承:每個類一張表(Table per class)策略: 在 Hibernate 中對應(yīng)元素:每個類層次結(jié)構(gòu)一張表(Single table per class hierarch
38、y)策略:在 Hibernate 中對應(yīng)元素連接的子類(Joined subclasses)策略:在 Hibernate 中對應(yīng) 元素你可以用 Inheritance 注解來定義所選擇的策略.這個注解需要在每個類層次結(jié)構(gòu)(class hierarchy) 最頂端的實(shí)體類上使用.目前還不支持在接口上進(jìn)行注解.這種策略有很多缺點(diǎn)(例如:多態(tài)查詢和關(guān)聯(lián)),EJB3 規(guī)范, Hibernate 參考手冊, Hibernate in Action,以及其他許多地方都對此進(jìn)行了描述和解釋.Hibernate 使用 SQION 查詢來實(shí)現(xiàn)這種策略.通常使用場合是在一個繼承層次結(jié)構(gòu)的頂端:Entity Inh
39、eritantrategy = InheritanceType.TABLE_PER_CLASS)public class Flight implements Serializable 這種策略支持雙向的一對多關(guān)聯(lián).這里不支持 IDENTITY策略,因?yàn)?id 必須在多個表間共享.當(dāng)然,一旦使用這種策略就意味著你不能使用AUTO和 IDENTITY.整個繼承層次結(jié)構(gòu)中的父類和子類的所有屬性都到同一個表中,他們的實(shí)例通過一個辨別符(discriminator)列來區(qū)分.:Entity Inheritantrategy=InheritanceType.SINGLE_TABLE)Discriminat
40、orColumn( name=planetype,discriminatorType=DiscriminatorType.STRING)DiscriminatorValue(Plane) public class Plane . Entity DiscriminatorValue(A320)public class A320 extends Plane . 在上面這個例子中,Plane 是父類,在這個類里面將繼承策略定義為InheritanceType.SINGLE_TABLE,并通過DiscriminatorColumn 注解定義了辨別符列(還可以定義辨別符的類型).最后,對于繼承層次結(jié)構(gòu)中
41、的每個類,DiscriminatorValue 注解指定了用來辨別該類的值.辨別符列的名字默認(rèn)為 HYPERLINK mailto:DTYPE%2C其默認(rèn)值為實(shí)體名(在E DTYPE,其默認(rèn)值為實(shí)體名(在E 中定義),其類型為 DiscriminatorType.STRING.A320 是子類,如果不想使用默認(rèn)的辨別符,只需要指定相應(yīng)的值即可.其他的如繼承策略,辨別標(biāo)志字段的類型都是自動設(shè)定的.Inheritance 和DiscriminatorColumn 注解只能用于實(shí)體層次結(jié)構(gòu)的頂端.當(dāng)每個子類到一個表時, PrimaryKeyJoinColumn
42、和PrimaryKeyJoinColumns注解定義了每個子類表關(guān)聯(lián)到父類表的主鍵:Entity Inheritantrategy=InheritanceType.JOINED)public class Boat implements Serializable . Entitypublic class Ferry extends Boat . Entity PrimaryKeyJoinColumn(name=BOAT_ID) public class AmericaCupClassextends Boat . 以上所有實(shí)體都使用了 JOINED 策略, Ferry 表和 Boat 表使用同名的
43、主鍵.而 AmericaCupClass 表和Boat 表使用了條件Boat.id = AmericaCupClass.BOAT_ID 進(jìn)行關(guān)聯(lián).有時候通過一個(技術(shù)上或業(yè)務(wù)上)父類共些公共屬性是很有用的,同時還不用將該父類作為的實(shí)體(也就是該實(shí)體沒有對應(yīng)的表).這個時候你需要使用MappedSuperclass 注解來進(jìn)行MappedSuperclass public class BaseEntity Basic.Temporal(TemporalType.TIMEST public Date getLastUpdate() . public String getLastUpdater()
44、. .)Entity class Order extends BaseEntity Id public.eger getId() . 在數(shù)據(jù)庫中,上面這個例子中的繼承的層次結(jié)構(gòu)最終以 Order 表的形式出現(xiàn),該表擁有 id, lastUpdate 和 lastUpdater 三個列.父類中的屬性注意這種情況下的父類不再處在繼承層次結(jié)構(gòu)的頂端.將到其子類實(shí)體.注意,沒有注解為MappedSuperclass 的父類中的屬性將被忽略.除非顯式使用Hibernate annoion 中的AcsType 注解,否則將從繼承層次結(jié)構(gòu)的根實(shí)體中繼承類型(包括字段或方法)這對于Embeddable 對象的
45、父類中的屬性持久化同樣有效.只需要使用MappedSuperclass 注解即可(雖然這種方式不會納入 EJB3 標(biāo)準(zhǔn))可以將處在在繼承層次結(jié)構(gòu)的中間位置的類注解為MappedSuperclass.在繼承層次結(jié)構(gòu)中任何沒有被注解為MappedSuperclass 或Entity略.的類都將被忽你可以通過 AttributeOverride 注解覆蓋實(shí)體父類中的定義的列.這個注解只能在繼承層次結(jié)構(gòu)的頂端使用.MappedSuperclasspublic class FlyingObject implements Serializable publicgetAltitude() return al
46、titude;TransientpublicgetMetricAltitude() return metricAltitude;ManyToOne public PropulType getPropul() return metricAltitude;.EntityAttributeOverride( name=altitude, column = Column(name=fld_altitude) )AssotionOverride(name=propul_fk) ),joinColumns=JoinColumn(name=fld_propulpublic class Plane exten
47、ds FlyingObject .在上面這個例子中,altitude 屬性的值最終將持久化到Plane 表的fld_altitude 列.而名為propul的關(guān)聯(lián)則保存在 fld_propul_fk 外間列.你可以為Entity和MappedSuperclass注解的類以及那些對象為Embeddable 的屬性定義AttributeOverride 和AssotionOverride.使用OneToOne 注解可以建立實(shí)體 bean 之間的一對一的關(guān)聯(lián).一對一關(guān)聯(lián)有三種情況:一是關(guān)聯(lián)的實(shí)體都共享同樣的主鍵,二是其中一個實(shí)體通過外鍵關(guān)聯(lián)到另一個實(shí)體的主鍵(注意要模擬一對一關(guān)聯(lián)必須在外鍵列上添加唯
48、一約束).三是通過關(guān)聯(lián)表來保存兩個實(shí)體之間的連接關(guān)系(注意要模擬一對一關(guān)聯(lián)必須在每一個外鍵上添加唯一約束).首先,通過共享主鍵來進(jìn)行一對一關(guān)聯(lián)Entitypublic class Body :Idpublic Long getId() return id; OneToOne(cascade = CascadeType.ALL) PrimaryKeyJoinColumnpublic Heart getHeart() return heart;.Entitypublic class Heart Idpublic Long getId() .上面的例子通過使用注解PrimaryKeyJoinColu
49、mn 定義了一對一關(guān)聯(lián).下面這個例子使用外鍵列進(jìn)行實(shí)體的關(guān)聯(lián).Entitypublic class Customer implements Serializable OneToOne(cascade = CascadeType.ALL) JoinColumn(name=passport_fk)public Passport getPassport() .Entitypublic class Passport implements Serializable OneToOne(mappedBy = passport) public Customer getOwner() .上面這個例子中,Cust
50、omer 通過 Customer 表中名為的 passport_fk Passport 關(guān)聯(lián).JoinColumn 注解定義了聯(lián)接列(join column).外鍵列和該注解和Column 注解有點(diǎn)類似,但是多了一個名為 referencedColumnName 的參數(shù).該參數(shù)定義了所關(guān)聯(lián)目標(biāo)實(shí)體中的聯(lián)接列.注意,當(dāng) referencedColumnName 關(guān)聯(lián)到非主鍵列的時候,關(guān)聯(lián)的目標(biāo)類必須實(shí)現(xiàn)Serializable,還要注意的是所的屬性對應(yīng)單個列(否則無效).一對一關(guān)聯(lián)可能是雙向的.在雙向關(guān)聯(lián)中,有且僅有一端是作為主體(owner)在的:主體端負(fù)責(zé)聯(lián)接列(即更新).對于不需要這種關(guān)系
51、的從表則通過 mappedBy 屬性進(jìn)行mappedBy 的值指向主體的關(guān)聯(lián)屬性.在上面這個例子中,mappedBy 的值為 passport.最后,不必也不能再在被關(guān)聯(lián)端(owned side)定義聯(lián)接列了,因?yàn)橐呀?jīng)在主體端進(jìn)行.了如果在主體沒有JoinColumn,系統(tǒng)自動進(jìn)行處理:在主表(owner table)中將創(chuàng)建聯(lián)接列,列名為:主體的關(guān)聯(lián)屬性名下劃線被關(guān)聯(lián)端的主鍵列名.在上面這個例子中是 passport_id,因?yàn)镃ustomer 中關(guān)聯(lián)屬性名為 passport, Passport 的主鍵是 id.The third exotic.sibility (using an ass
52、otion table) is very第三種方式也許是最另類的(通過關(guān)聯(lián)表).Entitypublic class Customer implements Serializable OneToOne(cascade = CascadeType.ALL)Joable(name = CustomassportsjoinColumns = JoinColumn(name=customer_fk), inverseJoinColumns = JoinColumns(name=passport_fk)public Passport getPassport() .Entitypublic class P
53、assport implements Serializable OneToOne(mappedBy = passport) public Customer getOwner() .Customer 通過名為 Customassports 的關(guān)聯(lián)表和Passport 關(guān)聯(lián);該關(guān)聯(lián)表擁有名為 passport_fk 的外鍵列,該外鍵指向 Passport 表,該信息定義為 inverseJoinColumn的屬性值,而 customer_fk 外鍵列指向Customer 表,該信息定義為 joinColumns 的屬性值.你必須明確定義關(guān)聯(lián)表名和關(guān)聯(lián)列名.在實(shí)體屬性一級使用ManyToOne 注解
54、來定義多對一關(guān)聯(lián): Entity()public class Flight implements Serializable ManyToOne( cascade = CascadeType.PERSIST, CascadeType.MERGE ) JoinColumn(name=COMP_ID)public Companyreturn company;.pany() 其中JoinColumn 是可選的,關(guān)聯(lián)字段默認(rèn)值和一對一(one to one)關(guān)聯(lián)的情況相似,列名為:主體的關(guān)聯(lián)屬性名下劃線被關(guān)聯(lián)端的主鍵列名.pany 的主鍵是 id.在這個例子中是因?yàn)殛P(guān)聯(lián)的屬性是ManyToOne 注解有
55、一個名為Entity 的參數(shù),該參數(shù)定義了目標(biāo)實(shí)體名.通常不需要定義該參數(shù),因?yàn)樵诖蟛糠智闆r下默認(rèn)值(表示關(guān)聯(lián)關(guān)系的屬性類型)就可以很好的滿足要求了.不過下面這種情況下這個參數(shù)就顯得有意義了:使用接口作為返回值而不是常見的實(shí)體.Entity()public class Flight implements Serializable ManyToOne(cascade=CascadeType.PERSIST,CascadeType.MERGE,role=boldpanyImpl.class )JoinColumn(name=COMP_ID)public Companyreturn company;
56、.pany() publicerface Company .對于多對一也可以通過關(guān)聯(lián)表的方式來.通過Joable 注解可定義關(guān)聯(lián)表, 該關(guān)聯(lián)表包含了指回實(shí)體表的外鍵( 通過Joable.joinColumns)以及指向目標(biāo)實(shí)體表的外鍵(通過Joable.inverseJoinColumns).Entity()public class Flight implements Serializable ManyToOne( cascade = CascadeType.PERSIST, CascadeType.MERGE )Joable(name=pany,joinColumns = JoinColum
57、n(name=FLIGHT_ID), inverseJoinColumns = JoinColumns(name=COMP_ID)public Companyreturn company;.pany() 你可以對 Collection ,List(指有序列表, 而不是索引列表),Map 和Set 這幾種類型.EJB3 HYPERLINK mailto:規(guī)范定義了怎么樣使用javax.persistence.OrderBy 規(guī)范定義了怎么樣使用javax.persistence.OrderBy進(jìn)行注解來對有序列表進(jìn)行:該注解接受的參數(shù)格式:用逗號隔開的(目標(biāo)實(shí)體)屬性名及排序指令,如asc, a
58、ge desc,如果該參數(shù)為空,則默認(rèn)以 id 對該集合進(jìn)行排序.name如果某個集合在數(shù)據(jù)庫中對應(yīng)一個關(guān)聯(lián)表(asso集合屬性上面使用OrderBy 注解.對于這種情況的處理方法,請參考.tion table)的話,你不能在這個EJB3 允許你利用目標(biāo)實(shí)體的一個屬性作為 Map 的 key,這個屬性可以用MapKey(name=myProperty)來如果使用MapKey 注解的時候不提供屬性名,系統(tǒng)默認(rèn)使用目標(biāo)實(shí)體的主鍵.map 的 key 使用和屬性相同的列:不需要為 map key 定義實(shí)際上就表達(dá)了一個目標(biāo)屬性.的列,因?yàn)閙ap key注意一旦加載,key 不再和屬性保持同步,也就是
59、說,如果你改變了該屬性的值,在你的 Java 模型中的 key 不會自動更新(請參考).很多人被和MapKey 弄糊涂了.其他它們有兩點(diǎn)區(qū)別.MapKey 目前還有一些限制, JIRA 缺陷系統(tǒng).查看或者的注意一旦加載,key 不再和屬性保持同步,也就是說,如果你改變了該屬性的值,在你的 Java 模型中的 key 不會自動更新.(Hibernate 3 中 Map 支持的方式在當(dāng)前的發(fā)布版中還未得到支持).Hibernate 將集合分以下幾類.語義Java 實(shí)現(xiàn)類注解Bag 語義java.util.List, java.util.Collection.hibernate.annoions.C
60、ollectionOfElements 或OneToMany 或 ManyToMany帶主鍵的 Bag 語義(沒有普通 Bag 語義的限制) java.util.List, java.util.Collection(.hibernate.annoions.CollectionOfElements 或OneToMany 或 ManyToMany) 和 CollectionIdList 語義java.util.List(.hibernate.annoions.CollectionOfElementsOneToMany或或ManyToMany)以及 .hibernate.annoions.Index
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度泥工工程保修合同3篇
- 【金版學(xué)案】2014-2021學(xué)年高中歷史優(yōu)化訓(xùn)練(人教版必修1)第3課-從漢至元政治制度的演變
- 【備戰(zhàn)2021高考】全國2021屆高中地理試題匯編(11月份):I2城市化及其影響
- 2025年度智能交通授權(quán)經(jīng)銷商合作協(xié)議范本3篇
- G網(wǎng)絡(luò)下的實(shí)時在線輔導(dǎo)平臺
- 2025年度消防設(shè)備定期檢修與維保服務(wù)合同3篇
- 鄉(xiāng)村振興與農(nóng)村社區(qū)發(fā)展的路徑
- 2024年政府公共服務(wù)平臺建設(shè)項(xiàng)目政府采購代理服務(wù)協(xié)議3篇
- 2024年礦區(qū)土石方工程綜合施工承包合同一
- 證券公司財務(wù)管理數(shù)智化轉(zhuǎn)型升級策略探究
- 工程預(yù)結(jié)算課件
- 酒店宴會合同范本
- 貨款互抵三方協(xié)議合同范本
- 七年級道德與法治論文2000字(合集六篇)
- 嚴(yán)重精神障礙患者健康管理服務(wù)規(guī)范
- 風(fēng)險預(yù)測分析及風(fēng)險與機(jī)遇評估分析表
- 高中日語宣講 試聽課件
- 壓力彈簧力度計(jì)算器及計(jì)算公式
- 新生兒窒息診斷地專家共識
- 2023年重慶市旅游業(yè)統(tǒng)計(jì)公報要點(diǎn)
- 器械清洗的資料
評論
0/150
提交評論