版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、現(xiàn)在EJB3 實體Bean 是純粹的 POJO.實際上這表達了和 Hibernate 持久化實體對象同樣的概念.它們的都通過JDK5.0 注解來定義(EJB3 規(guī)范已經定義了對應的XML 描述語法).注解分為兩個部分,分別是邏輯注解和物理注解, 通過邏輯注解可以描述對象模型,類之間的關系等等, 而物理等等.注解則描述了物理的 schema,表,列,索引下面在代碼中將混合使用這兩種類型的注解.EJB3 注解的 API 定義在 javax.persistence.*包里面.大部分和 JDK5 兼容的 IDE(象 Eclipse,elliJ IDEA 和Netbeans 等等)都提供了注解接口和屬性
2、的自動完成功能.(這些不需要 IDE 提供特別的 EJB3 支持模塊,因為 EJB3注解是標準的 JDK5 注解)請閱讀 Js EJB 3.0 指南或者直接閱讀 HibernateAnnoions 測試代碼以獲取的可運行實例.Hibernate Annoions 提供的大部分單元測試代碼都演示了實際的例子,是一個獲取靈感的好地方.每一個持久化 POJO 類都是一個實體 bean,這可以通過在類的定義中使用Entity 注解來進行Entity:public class Flight implements Serializable Long id;Idpublic Long getId() ret
3、urn id; public void setId(Long id) this.id = id; 通過Entity 注解將一個類為一個實體 bean(即一個持久化 POJO 類),Id 注解則了該實體 bean 的標識屬性.其他的定義是隱式的.這種以隱式在新的 EJ3 規(guī)范中處于非常重要的位置,和以前的版本相比有了質的飛躍.為主體,以顯式為例外的配置方式在上面這段代碼中:Flight 類到Flight 表,并使用 id 列作為主鍵列.在對一個類進行注解時,你可以選擇對它的的屬性或者方法進行注解,根據你的選擇,Hibernate 的field 或property.類型分別為EJ3 規(guī)范要求在需要
4、的元素上進行注解,例如,如果類型為property 就要在 getter 方法上進行注解,如果種類型.類型為 field 就要在字段上進行注解.應該盡量避免混合使用這兩Hibernate 根據Id 或 EmbeddedId 的位置來判斷類型.Table 是類一級的注解,通過Table 注解可以為實體 bean字.指定表(table),目錄(catalog)和 schema 的名如果沒有定義Table,那么系統(tǒng)自動使用默認值:實體的短類名(不附帶包名).Entity Table(name=tbl_sky)public class Sky implements Serializable .Tabl
5、e 元素包括了一個 schema和一個 catalog 屬性,如果需要可以指定相應的值.結合使用UniqueConstra注解可以定義表的唯一約束(unique constra)(對于綁定到單列的唯一約束,請參考Column 注解)Table(name=tbl_sky,uniqueConstras = UniqueConstra(columnNames=month, day)上面這個例子中,在 month 和 day 這兩個字段上定義唯一約束.注意columnNames 數組中的值指的是邏輯列名.Hibernate 在 NamingStrategy 的實現(xiàn)中定義了邏輯列名.默認的 EJB3 命
6、名策略將物理字段名當作邏輯字段名來使用.注意該字段名和它對應的屬性名可能不同(如果字段名是顯式指定的話).除非你重寫了 NamingStrategy,否則不用擔心這些區(qū)別.你可以在實體 bean 中使用Ver注解,通過這種方式可添加對樂觀鎖定的支持:Entitypublic class Flight implements Serializable .Ve Column(name=OPTLOCK)publiceger getVer() . 上面這個例子中,ver到 OPTLOCK 列,屬性將entity manager 使用該字段來檢測更新策略).(防止更新丟失 請參考mit-wins根據 EJ
7、B3 規(guī)范,ver列可以是numeric 類型(方式)也可以是timest類型.Hibernate 支持任何自定義類型,只要該類型實現(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:實體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這幾個屬性則是被定義為可持久化和可獲取的.對于簡單屬性來說,默認的獲取方式是即時獲取(early fetch).當一個實體 Bean 的實例被創(chuàng)建時,Hibernate 會將這些屬性
11、的值從數據庫中提取出來,保存到 Bean 的屬性里.與即時獲取相對應的是延遲獲取(lazy fetch).如果一個屬性的獲取方式是延遲獲取(比如上面例子中的ment 屬性),Hibernate 在創(chuàng)建一個實體 Bean 的實例時,不會即時將這個屬性的值從數據庫中讀出.只有在該實體 Bean 的這個屬性第一次被調用時,Hibernate 才會去獲取對應的值. 通常你不需要對簡單屬性設置延遲獲取(lazy simple property),千萬不要和延遲關聯(lián)獲取(lazy assotion fetch)了(譯注:這里指lazy simple property 和 lazy assotion fet
12、ch了).為了啟用屬性級的延遲獲取,你的類必須經過特殊處理(instrumented):字節(jié)碼將被織入原始類中來實現(xiàn)延遲獲取功能,詳情參考 Hibernate 參考文檔.如果不對類文件進行字節(jié)碼特殊處理,那么屬性級的延遲獲取將被忽略.的替代方案是使用 EJB-QL 或者 Criteria 查詢的投影(projection)功能.Hibernate 和 EJB3 都支持所有基本類型的屬性.這些基本類型包括所有的 Java 基本類型,及其各自的 wrapper 類和 serializable 類.Hibernate Annoions 還支持將內置的枚舉類型到一個順序列(保存了相應的序列值)或一個字
13、符串類型的列(保存相應的字符串).默認是保存枚舉的序列值,但是你可以通過Enumerated 注解來進行調整(見上面例子中的 note 屬性).在的 Java API 中并沒有定義時間精度(temporal preci).因此處理時間類型數據時,你還需要定義將其在數據庫中所預期的精度.在數據庫中,表示時間類型的數據有 DATE, TIME,和 TIMEST三種精度(即單純的日期,時間,或者兩者兼?zhèn)?.可使用Temporal 注解來調整精度.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;如果某個屬性實現(xiàn)了 java.io.Serializable 同時也不是基本類型,并且沒有在該屬性上使用Lob 注解,那么 Hibernate 將使用自帶的 serializable 類型.使用 Column 注解可將屬性到列.
15、使用該注解來覆蓋默認值(關于默認值請參考 EJB3 規(guī)范).在屬性級使用該注解的方式如下:不進行注解和和和和和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,并且是不可更新的(也就是屬性值是不變的).上面這些注解可以被應用到正規(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 可選,列名(默認值是屬性名)unique 可選,是否在該列上設置唯一約束(默認值 false)nullable 可選,是否設置該列的值可以為空(默認值 false)insertable 可選,該列是否作為生成的 insert 語句中的一個列(默認值 true)updatable 可選,該列是否作為生成的 update 語句中的一個列(默認值 true)columnDefinition 可選: 為這個特定列覆蓋 SQL DDL 片段
18、(這可能導致無法在不同數據庫間移植)table 可選,定義對應的表(默認為主表)length 可選,列長度(默認值 255)preci可選,列十進制精度(decimal preci)(默認值 0)scale 可選,如果列十進制數值范圍(decimal scale)可用,在此設置(默認值 0)組件(embedded component),甚至覆蓋該實體中原在實體中可以定義一個有的列.組件類必須在類一級定義Embeddable 注解. 在特定的實體的關聯(lián)屬性上使用Embedded 和 AttributeOverride 注解可以覆蓋該屬性對應的對象的列: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; .對象繼承其所屬實體中定義的(注意:這可以通過使用 Hibernate 提供的Ac linkend=entity-hibspec /).類型sType 注解來覆蓋原有值)(請參考在上面的例子中,實體 bean分別是homeAddress 和 bornIn.有兩個組件屬性,可以看到 homeAddress 屬性并沒有注解.但是 Hibernate 自動檢測其對應的 Address 類中的Embeddable 注解,并將其看作一個持久化組件.對于Country 中已則使用Embedde
22、d 和AttributeOverride的屬性,注解來覆蓋原來的列名.正如你所看到的, Address 對象中還內嵌了 Country 對象,這里和homeAddress 一樣使用了 Hibernate 和 EJB3 自動檢測機制.目前 EJB3 規(guī)范還不支持覆蓋多層嵌套(即的列.對象中還包括其他對象)不過 Hibernate 通過在表達式中使用.符號表達式提供了對此特征的支持.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).對象中使用關聯(lián)注解( 如 *ToOne 和而 EJB3 規(guī)范尚不支持這樣的用法.你可以使用 Asso關聯(lián)列.tionOverride 注解來覆寫在同一個實體中使用兩個同類型的嵌入對象, 其默認列名是無效的:至少要對其中一個進行明確.Hibernate 在這方面走在了 EJB3 規(guī)范的前面,Hibernate 提供了 NamingStrategy, 在使用 Hibernate 時, 通過 NamingStrategy 你可以對默認的機制進行擴展.ponentSafeNamingStrategy 在默認的EJB3NamingStrategy
25、上進行了小小的,允許在同一實體中使用兩個同類型的嵌入對象而無須額外的.如果某屬性沒有注解,該屬性將遵守下面的規(guī)則:如果屬性為單一類型,則為Basic否則,如果屬性對應的類型定義了Embeddable 注解,則否則,如果屬性對應的類型實現(xiàn)了 Serializable,為Embedded則屬性被為Basic 并在一個列中保存該對象的 serialized 版本否則,如果該屬性的類型為 java.sql.Clob 或 java.sql.Blob,則作為Lob 并的 LobType.到適當xreflabel=Mapidentifiroperties使用Id 注解可以將實體 bean 中的某個屬性定義為
26、標識符(identifier).該屬性的值可以通過應用自身進行設置,也可以通過 Hiberante 生成( 使用 GeneratedValue 注解可以定義該標識符的生成策略:).AUTO - 可以是 identity column 類型,或者 sequence 類型或者 table 類型,取決于不同的底層數據庫.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適用于可移植的應用(在多個 DB 間切換).多個Id 可以共享同一個 identifier以了.,只要把 generator 屬性設成相同的值就可通過SequenceGenerator 和TableGenerator,你可以配置不同的 iden
28、tifier.每一個identifier一級(class level).類一級的器.應用級的都有自己的適用范圍,可以是應用級(application level)和類在外部是不可見的,而且類一級的可以覆蓋應用級的生成則定義在 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 都是應用級的.EMP_GEN 定義了一個使用 hilo 算法(max_lo 為 20)的 id(該將 id 的信息存在數據庫的某個表中.).id 的 hi 值保存在 GENERATOR_TABLE 中.在該表中 pkColumnNamekey
30、等價于 pkColumnValue EMP,而valueColumnName hi中 SEQ_GEN 定義了一個 sequence的是下一個要使用的最大值.,其使用名為 my_sequence 的 sequence.該hilo 算法基于 sequence,該 sequence 分配的大小為 20.注意,現(xiàn)在這個版本還不能處理 sequence的 initialValue 屬性.默認分配的大小為 50,因此如果你打算使用 sequence,并且希望每次都重新獲取新的值,務必將分配的大小設置為 1.EJB3.0 規(guī)范已經不再支持 Package 級別的定義. 但是你仍然可以在包上使用Generic
31、Generator注解(參考linkend=entity-hibspec-identifier /).SEQ_GEN 則定義了一個 sequence其對應的 sequence 名為 my_sequence.,注意目前Hibernate Annoions 還不支持 sequence initialValue 和 allocationSize 參數.中的下面這個例子展示了定義在類范圍(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,并將該實體中所有屬于主鍵的屬性都注解為Id對于 EJB2 的開發(fā)來說就是一個嶄新的用法.來說 IdClass 是很常見的,但是對于 Hibernate 的用戶組合主鍵類對應了一個實體類中的多個字段或屬性, 而且主鍵類中用于定義主鍵的字段或屬性和實體類中對應的字段或屬性在類型上必須一致.下面例子: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 指應的主鍵類.Hibernate 支持在組合標識符中定義關聯(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 中對應元素:每個類層次結構一張表(Single table per class hierarch
38、y)策略:在 Hibernate 中對應元素連接的子類(Joined subclasses)策略:在 Hibernate 中對應 元素你可以用 Inheritance 注解來定義所選擇的策略.這個注解需要在每個類層次結構(class hierarchy) 最頂端的實體類上使用.目前還不支持在接口上進行注解.這種策略有很多缺點(例如:多態(tài)查詢和關聯(lián)),EJB3 規(guī)范, Hibernate 參考手冊, Hibernate in Action,以及其他許多地方都對此進行了描述和解釋.Hibernate 使用 SQION 查詢來實現(xiàn)這種策略.通常使用場合是在一個繼承層次結構的頂端:Entity Inh
39、eritantrategy = InheritanceType.TABLE_PER_CLASS)public class Flight implements Serializable 這種策略支持雙向的一對多關聯(lián).這里不支持 IDENTITY策略,因為 id 必須在多個表間共享.當然,一旦使用這種策略就意味著你不能使用AUTO和 IDENTITY.整個繼承層次結構中的父類和子類的所有屬性都到同一個表中,他們的實例通過一個辨別符(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 注解定義了辨別符列(還可以定義辨別符的類型).最后,對于繼承層次結構中
41、的每個類,DiscriminatorValue 注解指定了用來辨別該類的值.辨別符列的名字默認為 HYPERLINK mailto:DTYPE%2C其默認值為實體名(在E DTYPE,其默認值為實體名(在E 中定義),其類型為 DiscriminatorType.STRING.A320 是子類,如果不想使用默認的辨別符,只需要指定相應的值即可.其他的如繼承策略,辨別標志字段的類型都是自動設定的.Inheritance 和DiscriminatorColumn 注解只能用于實體層次結構的頂端.當每個子類到一個表時, PrimaryKeyJoinColumn
42、和PrimaryKeyJoinColumns注解定義了每個子類表關聯(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 . 以上所有實體都使用了 JOINED 策略, Ferry 表和 Boat 表使用同名的
43、主鍵.而 AmericaCupClass 表和Boat 表使用了條件Boat.id = AmericaCupClass.BOAT_ID 進行關聯(lián).有時候通過一個(技術上或業(yè)務上)父類共些公共屬性是很有用的,同時還不用將該父類作為的實體(也就是該實體沒有對應的表).這個時候你需要使用MappedSuperclass 注解來進行MappedSuperclass public class BaseEntity Basic.Temporal(TemporalType.TIMEST public Date getLastUpdate() . public String getLastUpdater()
44、. .)Entity class Order extends BaseEntity Id public.eger getId() . 在數據庫中,上面這個例子中的繼承的層次結構最終以 Order 表的形式出現(xiàn),該表擁有 id, lastUpdate 和 lastUpdater 三個列.父類中的屬性注意這種情況下的父類不再處在繼承層次結構的頂端.將到其子類實體.注意,沒有注解為MappedSuperclass 的父類中的屬性將被忽略.除非顯式使用Hibernate annoion 中的AcsType 注解,否則將從繼承層次結構的根實體中繼承類型(包括字段或方法)這對于Embeddable 對象的
45、父類中的屬性持久化同樣有效.只需要使用MappedSuperclass 注解即可(雖然這種方式不會納入 EJB3 標準)可以將處在在繼承層次結構的中間位置的類注解為MappedSuperclass.在繼承層次結構中任何沒有被注解為MappedSuperclass 或Entity略.的類都將被忽你可以通過 AttributeOverride 注解覆蓋實體父類中的定義的列.這個注解只能在繼承層次結構的頂端使用.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的關聯(lián)則保存在 fld_propul_fk 外間列.你可以為Entity和MappedSuperclass注解的類以及那些對象為Embeddable 的屬性定義AttributeOverride 和AssotionOverride.使用OneToOne 注解可以建立實體 bean 之間的一對一的關聯(lián).一對一關聯(lián)有三種情況:一是關聯(lián)的實體都共享同樣的主鍵,二是其中一個實體通過外鍵關聯(lián)到另一個實體的主鍵(注意要模擬一對一關聯(lián)必須在外鍵列上添加唯
48、一約束).三是通過關聯(lián)表來保存兩個實體之間的連接關系(注意要模擬一對一關聯(liá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 定義了一對一關聯(liá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 關聯(lián).JoinColumn 注解定義了聯(lián)接列(join column).外鍵列和該注解和Column 注解有點類似,但是多了一個名為 referencedColumnName 的參數.該參數定義了所關聯(lián)目標實體中的聯(lián)接列.注意,當 referencedColumnName 關聯(lián)到非主鍵列的時候,關聯(lián)的目標類必須實現(xiàn)Serializable,還要注意的是所的屬性對應單個列(否則無效).一對一關聯(lián)可能是雙向的.在雙向關聯(lián)中,有且僅有一端是作為主體(owner)在的:主體端負責聯(lián)接列(即更新).對于不需要這種關系
51、的從表則通過 mappedBy 屬性進行mappedBy 的值指向主體的關聯(lián)屬性.在上面這個例子中,mappedBy 的值為 passport.最后,不必也不能再在被關聯(lián)端(owned side)定義聯(lián)接列了,因為已經在主體端進行.了如果在主體沒有JoinColumn,系統(tǒng)自動進行處理:在主表(owner table)中將創(chuàng)建聯(lián)接列,列名為:主體的關聯(lián)屬性名下劃線被關聯(lián)端的主鍵列名.在上面這個例子中是 passport_id,因為Customer 中關聯(lián)屬性名為 passport, Passport 的主鍵是 id.The third exotic.sibility (using an ass
52、otion table) is very第三種方式也許是最另類的(通過關聯(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 的關聯(lián)表和Passport 關聯(lián);該關聯(lián)表擁有名為 passport_fk 的外鍵列,該外鍵指向 Passport 表,該信息定義為 inverseJoinColumn的屬性值,而 customer_fk 外鍵列指向Customer 表,該信息定義為 joinColumns 的屬性值.你必須明確定義關聯(lián)表名和關聯(lián)列名.在實體屬性一級使用ManyToOne 注解
54、來定義多對一關聯(lián): Entity()public class Flight implements Serializable ManyToOne( cascade = CascadeType.PERSIST, CascadeType.MERGE ) JoinColumn(name=COMP_ID)public Companyreturn company;.pany() 其中JoinColumn 是可選的,關聯(lián)字段默認值和一對一(one to one)關聯(lián)的情況相似,列名為:主體的關聯(lián)屬性名下劃線被關聯(lián)端的主鍵列名.pany 的主鍵是 id.在這個例子中是因為關聯(lián)的屬性是ManyToOne 注解有
55、一個名為Entity 的參數,該參數定義了目標實體名.通常不需要定義該參數,因為在大部分情況下默認值(表示關聯(lián)關系的屬性類型)就可以很好的滿足要求了.不過下面這種情況下這個參數就顯得有意義了:使用接口作為返回值而不是常見的實體.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 .對于多對一也可以通過關聯(lián)表的方式來.通過Joable 注解可定義關聯(lián)表, 該關聯(lián)表包含了指回實體表的外鍵( 通過Joable.joinColumns)以及指向目標實體表的外鍵(通過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進行注解來對有序列表進行:該注解接受的參數格式:用逗號隔開的(目標實體)屬性名及排序指令,如asc, a
58、ge desc,如果該參數為空,則默認以 id 對該集合進行排序.name如果某個集合在數據庫中對應一個關聯(lián)表(asso集合屬性上面使用OrderBy 注解.對于這種情況的處理方法,請參考.tion table)的話,你不能在這個EJB3 允許你利用目標實體的一個屬性作為 Map 的 key,這個屬性可以用MapKey(name=myProperty)來如果使用MapKey 注解的時候不提供屬性名,系統(tǒng)默認使用目標實體的主鍵.map 的 key 使用和屬性相同的列:不需要為 map key 定義實際上就表達了一個目標屬性.的列,因為map key注意一旦加載,key 不再和屬性保持同步,也就是
59、說,如果你改變了該屬性的值,在你的 Java 模型中的 key 不會自動更新(請參考).很多人被和MapKey 弄糊涂了.其他它們有兩點區(qū)別.MapKey 目前還有一些限制, JIRA 缺陷系統(tǒng).查看或者的注意一旦加載,key 不再和屬性保持同步,也就是說,如果你改變了該屬性的值,在你的 Java 模型中的 key 不會自動更新.(Hibernate 3 中 Map 支持的方式在當前的發(fā)布版中還未得到支持).Hibernate 將集合分以下幾類.語義Java 實現(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 節(jié)育器植入后異位妊娠的預防與處理-洞察及研究
- 跨文化協(xié)作與數字技術在電影制作中的應用-洞察及研究
- 綠色環(huán)保材料在美妝產品中的應用與法規(guī)-洞察及研究
- 煤礦地質要素的修復與環(huán)境影響評估-洞察及研究
- 跨文化護理在護理機構服務行業(yè)的發(fā)展趨勢-洞察及研究
- 混沌動力學在環(huán)境保護策略設計中的重要性-洞察及研究
- 跨媒介聽覺敘事研究-洞察及研究
- 生產部內部控制管理制度
- 線路板生產質量管理制度
- 天橋街道安全生產制度
- 娃娃菜栽培技術
- 工業(yè)鍋爐司爐課件
- 數字營銷專業(yè)人才培養(yǎng)方案
- 新疆概算管理辦法
- 女性中醫(yī)健康養(yǎng)生講座
- 《養(yǎng)老服務政策法規(guī)與標準》智慧健康養(yǎng)老服務專業(yè)全套教學課件
- 知識付費商業(yè)模式設計
- 無錫車聯(lián)天下信息技術有限公司智能網聯(lián)汽車車載顯示模組研發(fā)及智能化生產項目環(huán)評資料環(huán)境影響
- 抹灰層陰陽角方正度控制技術
- 【SA8000標準(社會責任標準)對我國勞動密集型產業(yè)的影響及應對措施研究12000字(論文)】
- 醫(yī)療行業(yè)知識產權教育的必要性
評論
0/150
提交評論