Hibernate32基礎教程_第1頁
Hibernate32基礎教程_第2頁
Hibernate32基礎教程_第3頁
Hibernate32基礎教程_第4頁
Hibernate32基礎教程_第5頁
已閱讀5頁,還剩151頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、Hibernate 3.2教程教程配置 操作系統(tǒng):Windows2003 數(shù)據(jù)庫:MySQL 5.0 Hibernate版本:Hibernate 3.2 JDK版本:1.6.2 Web服務器:Tomcat 6.0.13 代碼段規(guī)范:3.2持久層簡介 持久化(Persistence),即把數(shù)據(jù)(如內(nèi)存中的對象)保存到可永久保存的存儲設備中(如磁盤)。持久化的主要應用是將內(nèi)存中的數(shù)據(jù)存儲在關系型的數(shù)據(jù)庫中,當然也可以存儲在磁盤文件中、XML數(shù)據(jù)文件中等等。 持久層(Persistence Layer),即專注于實現(xiàn)數(shù)據(jù)持久化應用領域的某個特定系統(tǒng)的一個邏輯層面,將數(shù)據(jù)使用者和數(shù)據(jù)實體相關聯(lián)。持久層

2、簡介 ORM-Object/Relational Mapper,即“對象-關系型數(shù)據(jù)映射組件”。對于O/R,即 Object(對象)和 Relational(關系型數(shù)據(jù)),表示必須同時使用面向?qū)ο蠛完P系型數(shù)據(jù)進行開發(fā)。 備注:建模領域中的 ORM 為 Object/Role Modeling(對象角色建模)。另外這里是“O/R Mapper”而非“O/R Mapping”。相對來講,O/R Mapping 描述的是一種設計思想或者實現(xiàn)機制,而 O/R Mapper指以O/R原理設計的持久化框架(Framework),包括 O/R機制還有 SQL自生成,事務處理,Cache管理等。Hiberna

3、te3.2配置 配置文件: Hibernate配置文件有兩種:一種是XML格式,默認為hibernate.cfg.xml文件,一種是properties格式,默認為perties文件。 兩種配置文件的區(qū)別:不同的配置文件的初始化方法不同 1.properties文件: (這里是3.2里面的代碼段寫法) 2.XML文件:Configuration config = new AnnotationConfiguration();config.addClass(myclass.class);Configuration config = new AnnotationConfig

4、uration().config();Hibernate3.2配置 注意事項: 1.在Hibernate啟動過程中,會先找perties,然后讀取hibernate.cfg.xml,后者會覆蓋前者相同的屬性。 2. XML文件格式的配置文件不支持addClass方法!這是因為在配置文件XML文件中,已經(jīng)定義了Mpaaing文件,因此就不需要在用編碼方式導入POJO文件了。 *:addClass方法:添加映射類,在Hibernate 3.1里面,一般配置映射類我們有兩種方式,一種是編程方式使用這個方法添加,一種是在映射文件myClass.hbm.xml里面配置好了直接使

5、用。Hibernate3.2配置 注意事項: 3.在Hibernate 3.2里面,有兩種方式來處理配置中的映射類,第一種是使用Hibernate 3.1里面的方式,如前面所講,另外一種是使用Hibernate 3.2里面結(jié)合JPA的方式,需要注意的是Hibernate 3.2里面的方式是不能支持addClass方法,所以在Hibernate 3.2里我們需要直接在hibernate.cfg.xml文件里面配置好映射類,而不能通過addClass來添加。 *:在Hibernate 3.2里面,使用Annotation的時候?qū)嶋H上是使用的JPA規(guī)范,所以有時候我們又稱為Hibernate-JAP

6、,即在注釋POJO的時候我們使用的是JPA,即JavaEE 5.0里面的新規(guī)范。Hibernate3.2配置 注意事項: 4.在使用configure()方法的時候,如果不傳入?yún)?shù),就在CLASSPATH里面尋找hibernate.cfg.xml文件或者perties文件,即在默認路徑里面尋找配置文件。也可以將默認的配置文件名修改掉比如使用myConfig.cfg.xml,然后在編程中這樣使用: 這里的目錄是相對于CLASSPATH的根目錄,文件路徑是根據(jù)Project的CLASSPATH來的。Configuration config = new Annotation

7、Configuration();SessionFactory sf = config.configure(“/myConfig.cfg.xml”).buildSessionFactory();Hibernate3.2配置 文件位置: 實際開發(fā)項目中文件位置: (Eclipse平臺) (NetBeans平臺)Hibernate3.2配置 可選配置: 一般可選屬性是用來控制Hibernate在運行期的行為的,它們擁有適當?shù)哪J值。它們分為以下幾種: 1.Hibernate配置屬性 2.Hibernate JDBC和連接屬性 3.Hibernate 緩存屬性 4.Hibernate 事務屬性 5.其

8、他屬性 詳細情況見file/config.doc文件Hibernate3.2配置 可選配置: SQL方言:你應當總是為你的數(shù)據(jù)庫將hibernate.dialect屬性設置成正確的 org.hibernate.dialect.Dialect子類. 如果你指定一種方言, Hibernate將為上面列出的一些屬性使用合理的默認值, 為你省去了手工指定它們的功夫. SQL方言詳細參考file/dialect.doc文件或者參考hibernate3.jar文件dialect包里面的內(nèi)容。Hibernate3.2配置 可選配置: 除了Hibernate可編程配置方式以外,還有以下四種配置方式: 1.傳一

9、個傳一個java.util.Properties實例給實例給 Configuration.setProperties().。2.將將perties放置在類路徑放置在類路徑(classpath)的根目錄下的根目錄下 (root directory)。3.通過通過java -Dproperty=value來設置系統(tǒng)來設置系統(tǒng) (System)屬性屬性。4.在在hibernate.cfg.xml中加入元素中加入元素 。 *:Configuration實例被設計成啟動期間(startup-time)對象, 一旦SessionFactory創(chuàng)建完成它就被丟棄了。Hibernat

10、e3.2映射 實體映射: 實體映射一般情況下我們映射的是一個類,我們把一個代表邏輯業(yè)務的數(shù)據(jù)對象稱為一個實體,而Hibernate在對實體的增加、刪除、修改、查詢的時候都是以實體為單位的,而在真正開發(fā)過程中,我們是以面向?qū)ο蟮姆绞剑褜嶓w定義為一個類,通常情況下這個類是一個POJO的對象。 (*:前面我們已經(jīng)講過了Hibernate 3.2里面在類的定義里面我們使用的是JPA的映射方式,自然我們在實體映射過程也使用的是JPA里面的Annotation(JDK5.0里面的新功能)方式。)Hibernate3.2映射 實體映射: 我們用下邊的方式來注釋一個實體,即一個POJO類。 我們通過Enti

11、ty注解將一個類聲明為一個實體類,我們把這樣的實體化的類稱為一個持久化POJO類,在默認情況下,我們定義的類名就是數(shù)據(jù)庫的表名, Entity有一個name屬性,它代表了一個獨一無二的持久化對象。Entitypublic class Flight implements Serializable Hibernate3.2映射 實體映射: 我們還可以使用Table注釋來標明數(shù)據(jù)庫表名,一般情況下我們開發(fā)中使用下邊這樣的方式。 Table有四個屬性,分別是catalog、name、schema、uniqueConstraints。EntityTable(name=“myflight”)public

12、class Flight implements Serializable Hibernate3.2映射 實體映射: name屬性表示我們的POJO對象所對應的數(shù)據(jù)庫表名稱,這個是開發(fā)中使用得最多的一個屬性。 uniqueConstraints表示表的約束,一般情況下它是和字段約束一起使用的,也是開發(fā)中使用的次多的一個屬性。 catalog和schema屬性是相對而言實用得比較少的一個屬性,catalog代表我們建立的數(shù)據(jù)表的種類,schema代表我們創(chuàng)建的表的模式,適用于DB2和Oracle等大型數(shù)據(jù)庫。詳細情況請查閱JavaEE 5.0 API。 (*:這四個屬性都是可選屬性,所以一般不使用

13、屬性的時候我們就不使用Table注釋)Hibernate3.2映射 屬性映射: 1.主鍵映射 2.基本屬性映射 3.復合主鍵映射 4.外鍵映射 5.關聯(lián)關系映射 6.多表映射(又稱二級表映射) 7.繼承關系映射Hibernate3.2映射 屬性映射: 主鍵映射主鍵映射我們一般使用Id注解,Id是一個無屬性的注解,在屬性映射的注解里面,要么就在POJO屬性的定義時候注解,或者直接在Get方法中注解,注解代碼段如下: 或者: (*:所有屬性注解時只能用一種方式,所有屬性必須統(tǒng)一)Idpublic int userId;/在屬性定義時注解Idpublic int getUserId() return

14、 userId; /在Get方法中注解Hibernate3.2映射 屬性映射: 我們在定義主鍵的時候,我們可以注解主鍵類型,一般使用GeneratedValue和GenerationType兩種注釋。 GeneratedValue有兩個屬性,在使用序列生成主鍵和表生成主鍵的時候我們就使用generator屬性,直接設定種類的時候我們使用strategy屬性。一般情況下strategy的值就是GenerationType的一種。簡單定義如下:IdGeneratedValue(strategy=GenerationType.SEQUENCE,generator=“SEQ_NAME”)public

15、int getUserId() return userId; /序列主鍵的一般定義方式Hibernate3.2映射 屬性映射: GenerationType注解定義了標識符的生成策略: AUTO可以是identity column類型,或者sequence類型或者table類型,這個取決于不同的底層數(shù)據(jù)庫。 TABLE使用表生成主鍵策略 IDENTITY僅僅使用identity column類型 SEQUENCE使用序列生成策略,如同Oracle和PgSQL數(shù)據(jù)庫。 (*:這四種類型都是一個常量值,在定義的時候用作GeneratedValue的strategy屬性值使用。)Hibernate3

16、.2映射 屬性映射: AUTO生成策略用于可移植的應用(在多個DB之間切換),我們一般用這個來定義普通數(shù)據(jù)庫的自動增長類型的主鍵,如果要使用序列和表方式,可能還需要使用一種其他方式。就我個人開發(fā)經(jīng)驗而言,MySQL、SQLServer和DB2都可以使用這樣的方式,而Oracle和PgSQL的體系結(jié)構(gòu)不同,僅僅定義這樣的方式是不夠的,總之,AUTO類型的主鍵生成策略是根據(jù)數(shù)據(jù)庫來的,我們必須根據(jù)不同的數(shù)據(jù)庫選擇不同的主鍵策略。Hibernate3.2映射 屬性映射: IDENTITY類型一般中小型開發(fā)使用得很少,詳細用法大家可以參考JavaEE 5.0 API。 SEQUENCE類型的一般適用于

17、Oracle和PgSQL數(shù)據(jù)庫,在使用序列生成策略的時候,我們需要使用另外一個注解SequenceGenerator。這個我們一般是在類級別上定義的,它將表里面定義的序列生成器和我們此POJO類使用的序列生成器連接在一起,是一個邏輯序列和物理序列的橋梁。Hibernate3.2映射 屬性映射: SequenceGenerator有四個屬性: name表示的是邏輯主鍵使用的引用名稱,即GeneratedValue中generator屬性使用的值。這里我們定義的序列名和生成主鍵的生成器名稱是統(tǒng)一的。 initialValue是表示序列的初始值,因為序列一般用于自動增長,這個屬性值就是序列的“種子”

18、值。 allocationSize是表示增長值,即序列每次增長的數(shù)值。 sequenceName屬性表示物理序列的名稱,即數(shù)據(jù)庫里面定義的序列的名稱,這里需要自己知道數(shù)據(jù)庫序列名。Hibernate3.2映射 屬性映射: TABLE類型是最復雜的一種主鍵生成策略,TABLE策略需要另外的一張表來存儲主鍵值,主要借助TableGenerator注解, TableGenerator注解屬性比較多,這里講常用的幾個,詳細內(nèi)容可以查閱JavaEE 5.0 API。 name表示的是邏輯主鍵使用的引用名稱,即GeneratedValue中generator屬性使用的值,和SequenceGenerato

19、r注解中name屬性的原理是一樣的。 table是主鍵表的名稱,即數(shù)據(jù)庫中主鍵表表名。 pkColumnName是主鍵表中表主鍵的字段名。 (*:其他的可以參考API內(nèi)容。)Hibernate3.2映射 屬性映射: 下邊是一個完整序列生成策略的例子。(主鍵生成)EntitySequenceGenerator( name=“SEQ_STORE”, sequenceName=“id_sequence”)public class Store implements Serializable private Long id; IdGeneratedValue(strategy=GenerationTyp

20、e.SEQUENCE,generator=“SEQ_STORE”) public Long getId() return id; Hibernate3.2映射 屬性映射: 1.主鍵映射 2.基本屬性映射 3.復合主鍵映射 4.外鍵映射 5.關聯(lián)關系映射 6.多表映射(又稱二級表映射) 7.繼承關系映射Hibernate3.2映射 屬性映射: 基本屬性映射基本屬性映射我們一般使用Column注解,此注解可以將POJO類的屬性映射到數(shù)據(jù)庫的列,可以覆蓋默認值,此注解的使用方式如下: 1.不進行注解 2.和Basic一起使用 3.和Version一起使用 4.和Lob一起使用 5.和Temporal

21、一起使用 6.與CollectionOfElements一起使用(僅僅針對Hibernate)Hibernate3.2映射 屬性映射: 先解釋Column注解的屬性,因為Column的屬性相對而言比較多,而且所有屬性都是可選的,所以需要我們在開發(fā)過程中靈活運用。 name屬性表示列名,如果沒有此屬性,就是POJO類里面默認的屬性名。 unique用來設置此屬性是否唯一的約束,默認false。 nullable用來設置該列的值是否可以為空,默認false。 insertable表示該列是否作為生成的insert語句中的一個列,默認true。Hibernate3.2映射 屬性映射: updatab

22、le表示該列是否作為生成的update語句中的一個列,默認true。 columnDefinition為這個特定的列覆蓋SQL DLL片段,這個設置了過后可能導致無法進行數(shù)據(jù)庫移植操作。 table定義對應的表,默認為主表,這個在多表映射中會詳細講解。 length是對應的列的長度,默認255。 precision是十進制的進度,一般是decimal類型使用,默認0。 scale是指十進制數(shù)值范圍,使用相對較少。Hibernate3.2映射 屬性映射: 不進行注解規(guī)則不進行注解規(guī)則:若屬性沒有注解,該屬性必須遵守下邊的規(guī)則: 1).如果屬性為單一類型,則映射為Basic 2).如果屬性對應類型

23、定義了Embeddable注解,則映射為Embedded 3).如果屬性對應類型實現(xiàn)了Serializable,則屬性被映射為Basic并在一個列中保存改對象serialized版本。 4).如果該屬性類型為Clob或Blob,則作為Lob并且映射到適當?shù)腖obType。Hibernate3.2映射 屬性映射: 一般POJO類為原始屬性的時候,直接使用Column注解就可以滿足我們開發(fā)的需要,實體Bean中所有的非static,非transient屬性都可以被持久化,而除非我們直接對屬性使用Transient注釋。如果沒有定義注解的屬性,系統(tǒng)會自動為屬性加上Basic注解。 而復合屬性還需要更

24、加詳細的注解,比如時間類型、復合類型(組件類型)、大數(shù)據(jù)類型(Clob,Blob)。Hibernate3.2映射 屬性映射: 時間類型的屬性,我們要使用Temporal注解。Temporal注解使用方式如下: Temporal默認屬性為TemporalType值,TemporalType有三個值:DATE,TIME,TIMESTAMP。 DATE對應java.sql.Date類型屬性 TIME對應java.sql.Time類型屬性 TIMESTAMP對應java.sql.Timestamp類型屬性Temporal(TemporalType.DATE)public Date getDepartu

25、reTime()Hibernate3.2映射 屬性映射: 大數(shù)據(jù)類型的屬性,我們可以直接在屬性上使用Lob注解就可以了。 復合類型的屬性,我們可以使用組件映射,組件映射是使用的嵌入式對象,我們可以在一個實體里面定義一個嵌入式組件,而且可以覆蓋實體中原有的列映射。我們在類級別上定義Embeddable注解,在特定的實體關聯(lián)屬性上使用Embedded和AttributeOverride注解就可以完成復合映射了,即嵌入式對象的映射。Hibernate3.2映射 屬性映射: 因為復合屬性比較復雜,先給個簡單的例子:Entitypublic class Person implements Seriali

26、zable /使用默認的持久化組件 Customer homeCustomer; Embedded AttributeOverrides( AttributeOverride(name=“iso2”,column=Column(name=“bIso2”), AttributeOverride(name=“name”,column=Column(name=“con”) ) Country bornIn;Hibernate3.2映射 屬性映射: Customer類定義如下: 這里需要注意的是,Customer屬性名稱就是表里面字段名稱,因為這是默認的映射方式,所以我們在注解默認映射方式的時候,必須

27、保證組件的屬性名和數(shù)據(jù)庫表的字段名保持一致。Embeddablepublic class Customer implements Serializable String city; Country nationality;Hibernate3.2映射 屬性映射: Country類的定義如下: 若不使用嵌入式方法就需要這樣的注解方式,注意,AttributeOverride注解的name屬性就是此類的屬性名。Embeddablepublic class Country implements Serializable private String iso2; Column(name=“con”)

28、private String name; /省略部分為兩屬性的Get方法和Set方法Hibernate3.2映射 屬性映射: 上邊例子中,Customer對象中還嵌套了Country對象,這里和homeCustomer一樣使用了Hibernate和EJB3的自動檢測機制,但是目前EJB3規(guī)范還不支持覆蓋多層嵌套(即嵌入式對象中還包括其他嵌入式對象)的列映射。可是我們可以使用下邊的方法:EmbeddedAttributeOverrides(AttributeOverride(name=“city”,column=Column(name=“fld_city”),AttributeOverride(

29、name=“nationality.iso2”,column=Column(name=“bIso2”),AttributeOverride(name=“”,column=Column(name=“con”)Customer homeCustomer;Hibernate3.2映射 屬性映射: 復合屬性注意事項: 1.Hibernate注解支持很多EJB3規(guī)范中沒有明確定義的特性,例如可以使用MappedSuperclass注解可支持表繼承。 2.Hibernate支持在嵌入式對象中用關聯(lián)注解,但是EJB3規(guī)范現(xiàn)在不支持這樣的用法,我們可以使用Association

30、Override注解來覆寫關聯(lián)列。 3.在一個類型中同時使用兩個嵌入對象,默認列名就無效了,我們可以使用Hibernate中的NamingStrategy對默認機制擴展,詳細請查閱Hibernate 3.2引用規(guī)范。Hibernate3.2映射 屬性映射: 1.主鍵映射 2.基本屬性映射 3.復合主鍵映射 4.外鍵映射 5.關聯(lián)關系映射 6.多表映射(又稱二級表映射) 7.繼承關系映射Hibernate3.2映射 屬性映射: 復合主鍵映射復合主鍵映射有下邊幾種方法: 1.將組件類注解為Embeddable,并將組件屬性注解為Id 2.將組件的屬性注解為EmbeddedId 3.將類注解為IdC

31、lass,并將該實體中所有屬于主鍵的屬性都注解為IdHibernate3.2映射 屬性映射: 這里主要介紹IdClass的用法,因為EJB2開發(fā)中很常見,這個只是Hibernate中相對比較嶄新的一個用法。其他兩種方式和組件映射(嵌入式對象)差不多。 (*:復合主鍵類對應了一個實體中的多個字段和屬性,而且主鍵類中用于定義主鍵的字段或?qū)傩院蛯嶓w類中對應的字段或?qū)傩栽陬愋蜕媳仨氁恢隆? 下邊是一個簡單的例子:Hibernate3.2映射 屬性映射:EntityIdClass(FootballerPk.class)public class Footballer Id public String ge

32、tFirstname() return firstname; public void setFirstname(String firstname) this.firstname = firstname; Id public String getLastname() return lastname; public void setLastname(String lastname) this.lastname = lastname; Hibernate3.2映射 屬性映射: 下邊是主鍵類FootballerPk的定義Embeddablepublic class FootballerPK imple

33、ments Serializable public String getFirstname() return firstname; public void setFirstname(String firstname) this.firstname = firstname; public String getLastname() return lastname; public void setLastname(String lastname) this.lastname = lastname; Hibernate3.2映射 屬性映射: 上邊是使用IdClass的方式,或者是使用嵌入式方式,嵌入式

34、方式的用法有兩種(組件映射方式): 第一種如上,直接使用EmbeddedId注解。Entitypublic class RegionalArticle implements Serializable EmbeddedId public RegionalArticlePk getPk()public class RegionalArticlePk implements Serializable Hibernate3.2映射 屬性映射: 第二種辦法和注解組件類的辦法如出一轍。Entitypublic class RegionalArticle implements Serializable Id

35、public RegionalArticlePk getPk()Embeddablepublic class RegionalArticlePk implements Serializable Hibernate3.2映射 屬性映射: 在復合主鍵映射過程中需要注意的是: 1.使用Emb eddedId注解的時候,所依賴的類必須實現(xiàn)Serializable接口而且必須重寫equals()/hashCode()方法,我們也可以使用標識符映射屬性中描述的辦法使用IdClass,即Hibernate 3.1。 2.Embeddable注解默認繼承了其所屬實體的訪問類型,除非顯示使用了Hibernate

36、的AccessType注解(不屬于EJB3規(guī)范。)Hibernate3.2映射 屬性映射: 1.主鍵映射 2.基本屬性映射 3.復合主鍵映射 4.外鍵映射 5.關聯(lián)關系映射 6.多表映射(又稱二級表映射) 7.繼承關系映射Hibernate3.2映射 屬性映射: 外鍵映射外鍵映射主要介紹JoinColumns和JoinColumn的用法: JoinColumns只有一個value屬性,在EJB3.0規(guī)范里面,value屬性可以不用書寫,直接把value屬性值寫在注解的括號里面就可以了,和前邊Temporal注解一樣的用法。而JoinColumns的value屬性的值一般是一個JoinColum

37、n的集合。寫法如下:JoinColumns( JoinColumn(name=“parentCivility”, referencedColumnName = “isMale”), JoinColumn(name=“pLastName”, referencedColumnName = “l(fā)astName”), JoinColumn(name=“pFirstName”, referencedColumnName = “firstName”)Hibernate3.2映射 屬性映射: 接下來詳細介紹一下JoinColumn注解的用法,因為JoinColumns的值是一個JoinColumn數(shù)組,它定

38、義了關聯(lián)的組合外鍵,若我們不使用缺省值,顯示使用referencedColumnName是一個很好的實踐方案,像上邊一樣。一般情況下,我們在使用JoinColumns和JoinColumns的時候都是和其他標簽聯(lián)合使用的,這個我們會在多表映射和關聯(lián)關系映射中更加詳細地講解。Hibernate3.2映射 屬性映射: JoinColumn注解里面所有的屬性都是可選的,一般我們在表關聯(lián)的時候才會使用,這里詳細講解一下它的屬性用法: name屬性指定了實體對應的數(shù)據(jù)庫表(即主表)的外鍵列的字段名。數(shù)據(jù)庫表里面存儲外鍵的字段依賴于這個關系的種類,若連接類型是OneToOne或者ManyToOne(One

39、ToMany)的話,外鍵字段一般是位于源實體所對應的表,若連接類型是ManyToMany的話,外鍵字段則位于中間的連接表。若此字段我們不填寫,則表示數(shù)據(jù)庫里面的字段名和實體屬性名一樣,即此注解的默認用法。Hibernate3.2映射 屬性映射: referencedColumnName屬性表示關聯(lián)表(即外鍵表)的外鍵字段,在使用關系映射的過程中,此外鍵列一般是位于目標實體所對應的表里面,若我們在使用JoinTable注解的時候用到了此屬性,則此外鍵字段在表實體所對應的表里面。 (*:需要注意的是,上邊兩個屬性的意義是和數(shù)據(jù)庫表關聯(lián)原理一樣,但是他們的操作源是實體,即兩個屬性的值是我們在映射過程

40、源實體和目標實體的屬性名,即POJO類里面的屬性名而非數(shù)據(jù)庫字段名。)Hibernate3.2映射 屬性映射: columnDefinition屬性表示針對此列的SQL DDL定義語句,這個屬性使用了過后,此程序要移植在不同的DB之間相對就困難了,甚至不能夠進行移植操作,可否進行是根據(jù)數(shù)據(jù)庫來決定的。 insertable和updatable兩個屬性和Column的功能是一樣的,它表示此列是否作為生成的SQL 的INSERT語句和UPDATE語句中的一個列,默認值都是true。 nullable屬性表示外鍵是否可以為空,默認值是true。Hibernate3.2映射 屬性映射: unique屬

41、性表示此外鍵是一個獨一無二的鍵值,而對于一個連接列的鍵值來說,沒有必要顯示聲明此屬性。 table屬性指明了此外鍵屬于那張表,如果不設置此屬性,則鍵值指代的就是擁有此鍵的實體所對應的數(shù)據(jù)庫里面的表。Hibernate3.2映射 屬性映射: 1.主鍵映射 2.基本屬性映射 3.復合主鍵映射 4.外鍵映射 5.關聯(lián)關系映射 6.多表映射(又稱二級表映射) 7.繼承關系映射Hibernate3.2映射 屬性映射: 我們所操作的實體總共有7種 不同的關聯(lián)關系,從數(shù)量上來說,分為4種:OneToOne,ManyToOne,OneToMany,ManyToMany。此外,每一種關聯(lián)關系又分為雙向關聯(lián)關系和

42、單向關聯(lián)關系,就產(chǎn)生了8種組合,但是ManyToOne和OneToMany的雙向關聯(lián)關系是一回事,所以對于我們使用的實體來說總共有7種不同的關聯(lián)關系。 (*:因為關聯(lián)關系映射比較復雜,所以這里會用詳細的例子來講解這7種復雜的關聯(lián)關系。)Hibernate3.2映射 屬性映射: 5.1單向OneToOne關聯(lián) 5.2雙向OneToOne關聯(lián) 5.3單向OneToMany關聯(lián) 5.4單向ManyToOne關聯(lián) 5.5雙向OneToMany關聯(lián) 5.6單向ManyToMany關聯(lián) 5.7雙向ManyToMany關聯(lián)Hibernate3.2映射 屬性映射: 單向單向OneToOne關聯(lián)關聯(lián):我們假設兩

43、個實體,一個Customer對象,一個Customer對象,每個Customer對象僅僅有一個指向Customer對象的引用,同樣每個Customer對象也僅僅有一個指向Customer對象的引用。若Customer對象擁有對Customer的引用而Customer對象不具有對Customer的引用,這個關聯(lián)就是我們要講到的單向OneToOne關聯(lián)我們只能通過Customer對象讀取到Customer而不能遍歷對象關系反向讀取。Hibernate3.2映射 屬性映射: 上邊兩個實體的數(shù)據(jù)庫Schema的ER圖如下: 這里就是一個Customer與Customer對象的單向關聯(lián)關系,由數(shù)據(jù)庫結(jié)構(gòu)

44、可以看出Customer包含一個指向Customer的外鍵,而Customer卻不具有指向Customer的外鍵。CUSTOMERID int primary key,LAST_NAME char(20),FIRST_NAME char(20),HAS_GOOD_CREDIT int,ADDRESS_ID intADDRESSID int primary key,STREET char(40),CITY char(20),STATE char(2),ZIP char(10)10:1Hibernate3.2映射 屬性映射: 因為Address沒有指向Customer的引用,所以這里我們主要看Cu

45、stomer類的源代碼段:Entitypublic class Customer implements Serializable private Address address; OneToOne(cascade=CascadeType.ALL) JoinColumn(name=“ADDRESS_ID”) public Address getAddress() return address; public void setAddress(Address address) this.address = address; Hibernate3.2映射 屬性映射: 這樣我們就完成了一個Custome

46、r對象到Customer對象的單向一對一的關聯(lián)關系。(*:這里Customer類不需要寫任何注解,因為Customer本身不包含到Customer對象的引用。) 這里我們介紹兩種比較特殊的單向OneToOne的關聯(lián): 1.主鍵連接字段兩個關聯(lián)實體的主鍵代替了關聯(lián)字段,即都不具有外鍵與對方連接。 2.默認連接字段不指定連接字段的法則。Hibernate3.2映射 屬性映射: 主鍵連接字段:我們先看看主鍵連接字段的代碼段,再來討論。Entitypublic class Customer implements Serializable private Address address; OneToOn

47、e(cascade=CascadeType.ALL) PrimaryKeyJoinColumn public Address getAddress() return address; public void setAddress(Address address) this.address = address; Hibernate3.2映射 屬性映射: 這里我們引入了新的注釋PrimaryKeyJoinColumn,它有三個屬性: name屬性表示被注解所修飾的實體對應的主鍵字段名稱,若不是復合主鍵,此屬性可以不指定,它會自動掃描。 referencedColumnName代表連接到目標實體上的

48、字段,若不指定,默認為目標實體的主鍵。 columnDefinition在自動生成數(shù)據(jù)庫schema時用到,可以指定對應的SQL類型。Hibernate3.2映射 屬性映射: 這種情況下ER圖變化為: (*:我們可以看到,兩張表沒有直接的外鍵聯(lián)系到一起,只是利用了主鍵進行連接。)CUSTOMERID int primary key,LAST_NAME char(20),FIRST_NAME char(20),HAS_GOOD_CREDIT int,ADDRESSID int primary key,STREET char(40),CITY char(20),STATE char(2),ZIP

49、char(10)10:1Hibernate3.2映射 屬性映射: 默認連接字段:使用默認連接字段的時候,在上邊代碼段處去掉PrimaryKeyJoinColumn注解就可以了,默認連接需要注意的是數(shù)據(jù)庫的字段名稱,若沒有設置數(shù)據(jù)庫中的映射關系,它會自動生成,若設置了需要知道命名規(guī)則: 該外鍵的名稱:參與映射的成員屬性名稱(customer),緊隨一個”_”字符,再后跟被引用表的主鍵字段名稱。上邊例子中使用默認時,Customer表里面需要有一個customer_id字段來關聯(lián)Customer表。Hibernate3.2映射 屬性映射: 5.1單向OneToOne關聯(lián) 5.2雙向OneToOne

50、關聯(lián) 5.3單向OneToMany關聯(lián) 5.4單向ManyToOne關聯(lián) 5.5雙向OneToMany關聯(lián) 5.6單向ManyToMany關聯(lián) 5.7雙向ManyToMany關聯(lián)Hibernate3.2映射 屬性映射: 雙向雙向OneToOne關聯(lián)關聯(lián):我們假設兩個對象Customer和CreditCard對象,Customer對象有一個到CreditCard對象的引用,而同樣的CreditCard對象也有一個到Customer對象的引用。因為這樣我們可以通過Customer對象讀取到CreditCard對象,同樣也可以通過CreditCard對象讀取到Customer對象,而編程上我們只是需

51、要稍稍修改一下目標對象的代碼段。Hibernate3.2映射 屬性映射: 下邊是CreditCard目標實體的代碼段: (*:mappedBy屬性只有在雙向關聯(lián)中才能使用。)Entitypublic class CreditCard implements Serializable private Customer customer; OneToOne(mappedBy=“creditCard”) public Customer getCustomer() return customer; public void setCustomer(Customer customer) this.custo

52、mer = customer; Hibernate3.2映射 屬性映射: 而雙向關聯(lián)的ER圖如下邊所示: 這里就不再重復源實體的代碼段寫法,我們可以對照Customer到Address的關聯(lián),這樣我們就可以知道Customer到CreditCard對象的關聯(lián)中源實體部分的寫法。CUSTOMERID int primary key,LAST_NAME char(20),FIRST_NAME char(20),HAS_GOOD_CREDIT int,CREDIT_CARD_ID intCREDIT_CARDID int primary key,EXP date,NUMBER char(20),NA

53、ME char(4),ORGANIZATION char(20)10:1Hibernate3.2映射 屬性映射: 注意:注意:在雙向關聯(lián)更改關聯(lián)關系時,雙向關聯(lián)的兩端都要設置好,即源實體的注解和目標實體注解中的mappedBy都要設置好,前面已經(jīng)講過了mappedBy只能用于雙向關聯(lián),嚴格地說一般是用于雙相關聯(lián)中的目標實體。我們一般把源實體成為雙相關聯(lián)中的支配端,而目標實體則成為反轉(zhuǎn)端。實體與任何其他Java對象一樣,也會有指向其他對象的關聯(lián),在關聯(lián)關系更新的時候我們需要在內(nèi)存中同時設置好兩端的關聯(lián),這個也是雙向關聯(lián)的難點。Hibernate3.2映射 屬性映射: 5.1單向OneToOne關

54、聯(lián) 5.2雙向OneToOne關聯(lián) 5.3單向OneToMany關聯(lián) 5.4單向ManyToOne關聯(lián) 5.5雙向OneToMany關聯(lián) 5.6單向ManyToMany關聯(lián) 5.7雙向ManyToMany關聯(lián)Hibernate3.2映射 屬性映射: 單向單向OneToMany關聯(lián):關聯(lián):OneToMany關聯(lián)和OneToOne有太大的不同,在OneToMany和ManyToMany關聯(lián)時,要求開發(fā)人員使用對象的引用集合而不是單個對象引用。我們假設一個Customer對象和一組Phone對象,即一個Customer對象擁有許多Phone但是一個Phone只屬于一個Customer,同理因為是單向

55、關聯(lián),我們在讀取Customer的時候能夠讀取它對應的Phone對象集合,而讀取Phone的時候是不能讀取到它的Customer信息的。Hibernate3.2映射 屬性映射: 下邊是我們這個假設的ER圖: 這里有一個設計思想:在不使用中間表的含Many關系的關聯(lián)里面,我們一般在數(shù)據(jù)庫中把外鍵設置在Many端,如圖所示PHONE里含指向CUSTOMER的外鍵CUSTOMER_IDCUSTOMERID int primary key,LAST_NAME char(20),FIRST_NAME char(20),ADDRESS_ID int, CREDIT_CARD_ID intPHONEID i

56、nt primary key,NUMBER char(20),TYPE int,CUSTOMER_ID int10:MHibernate3.2映射 屬性映射: 下邊是Customer中的代碼段斷:Entitypublic class Customer implements Serializable private Collection phoneNumbers = new ArrayList(); OneToMany(cascade=CascadeType.ALL) JoinColumn(name=“CUSTOMER_ID”) public Collection getPhoneNumbers

57、() public void setPhoneNumbers(Collection phones) this.phoneNumbers = phones. Hibernate3.2映射 屬性映射: 從上邊的代碼段段我們可以看到,因為一個Customer含有多個Phone,所以Customer里面有一個Phone對象集合的引用而不是單個對象,而OneToMany注解使用的注解方式和OneToOne的注解方式?jīng)]有什么區(qū)別,我們從這里還可以知道我們引用了Phone表里面的CUSTOMER_ID字段。 接下來還介紹一種比較復雜的雙向OneToMany關聯(lián):關聯(lián)表映射。 (*:因為所有的默認表連接命名規(guī)

58、范和前面的一致,則后面所有關聯(lián)關系中我們不再講解默認表連接。)Hibernate3.2映射 屬性映射: 關聯(lián)表映射原理即是在CUSTOMER表和PHONE表之外創(chuàng)建一個張中間表,該中間表分別包含了到CUSTOMER表的外鍵引用和PHONE表的外鍵引用。這種解決方案的好處在于它不會將CUSTOMER表和PHONE表之間的記錄之間的關系強加于各自對應的兩張表里面,這是單向關聯(lián)常用的方式。Hibernate3.2映射 屬性映射: 這里我們引入一個新的注解JoinTable,此注解有六個屬性,且六個屬性都是可選的: name屬性表示了我們使用的中間表的名稱,若沒有則按照默認的命名規(guī)范來,即上邊的例子默

59、認會使用表CUSTOMER_PHONE,即兩張表的表名用下劃線連起來。 catalog、schema和uniqueConstraints三個屬性和Table注解的三個屬性是一樣的,這里還需要強調(diào)兩個Table里面沒有的屬性。Hibernate3.2映射 屬性映射: joinColumns屬性,和我們在做外鍵連接的時候的JoinColumns是一樣的用法,它的值是一個JoinColumn的集合,這個我們在接下來的例子可以看得到。inverseJoinColumns屬性的值也是一個JoinColumn的集合,它代表中間表所對應的目標實體的外鍵引用。 接下來我們看一個完整的例子:CUSTOMERID

60、 int primary key,LAST_NAME char(20),FIRST_NAME char(20),PHONEID int primary key,NUMBER char(20),TYPE int,CUSTOMER_PHONECUSTOMER_ID int,PHONE_ID intHibernate3.2映射 屬性映射: Customer類的代碼段:Entitypublic class Customer implements Serializable private Collection phoneNumbers = new ArrayList(); OneToMany(casca

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論