Hibernate配置文件中映射元素詳解_第1頁
Hibernate配置文件中映射元素詳解_第2頁
Hibernate配置文件中映射元素詳解_第3頁
Hibernate配置文件中映射元素詳解_第4頁
Hibernate配置文件中映射元素詳解_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、hibernate配置文件中映射元素詳解添加時(shí)刻 :2007-4-22本文中將講述hibernate的大體配置及配置文件的應(yīng)用,這關(guān)于正確熟練利用hibernate是相當(dāng)關(guān)鍵的。配置文件中映射元素詳解對(duì)象關(guān)系的映射是用一個(gè)xml 文檔來講明的。 映射文檔能夠利用工具來生成,如 xdoclet, middlegen和 andromda等。下面從一個(gè)映射的例子開始講解映射元素,映射文件的代碼如下。?xml version=1.0?!- 所有的 xml 映射文件都需要定義如下所示的doctype 。hibernate會(huì)先在它的類路徑(classptah)中搜索dtd 文件。- !doctype hi

2、bernate-mapping public -/hibernate/hibernate mapping dtd 3.0/en http :/ hibernate-mapping有幾個(gè)可選的屬性:schema屬性指明了這個(gè)映射的表所在的schema名稱。default-cascade屬性指定了默認(rèn)的級(jí)聯(lián)風(fēng)格可取值有none 、save 、update。auto-import屬性默認(rèn)讓我們?cè)诓樵冋Z言中可以使用非全限定名的類名可取值有true 、false 。package屬性指定一個(gè)包前綴。- hibernate-mapping schema=schemaname default-cascade

3、=none auto-import=true package=test!- 用 class 元素來定義一個(gè)持久化類- class name=people table=person!- id元素定義了屬性到表主鍵字段的映射。- id name=id!- 用來為該持久化類的實(shí)例生成唯一的標(biāo)識(shí)- generator class=native/id !- discriminator識(shí)別器是一種定義繼承關(guān)系的映射方法- discriminator column=subclass type=character/!- property元素為類聲明了一個(gè)持久化的,javabean風(fēng)格的屬性 - propert

4、y name=name type=stringcolumn name=name length=64 not-null=true /propertyproperty name=sex not-null=true update=false/!- 多對(duì)一映射關(guān)系 - many-to-one name=friend column=friend_id update=false/!- 設(shè)置關(guān)聯(lián)關(guān)系 - set name=friends inverse=true order-by=idkey column=friend_id/!一對(duì)多映射 - one-to-many class=cat/set /class

5、 /hibernate-mapping組件應(yīng)用的方式組件有兩種類型,即組件(component)和動(dòng)態(tài)組件( dynamic-component) 。在配置文件中,component元素為子對(duì)象的元素與父類對(duì)應(yīng)表的字段成立起映射關(guān)系。然后組件能夠聲明它們自己的屬性、組件或集合。component元素的概念如下所示:component name=propertyname class=classname insert=true|false upate=true|false access=field|property|classnameproperty ./many-to-one . /. /com

6、ponent在這段代碼中, name是指屬性名, class 是類的名字, insert指的是被映射的字段是不是出此刻sql的 insert 語句中, upate指出被映射的字段是不是出此刻sql 的 update 語句中, access指出訪問屬性的策略。hiebernate的大體配置hibernate的連接信息是從配置文件中加載的。hibernate的配置文件有兩種形式:一種是xml 格式的文件,一種是properties屬性文件。 properties形式的配置文件默許文件名是perties,一個(gè) properties形式的配置文件內(nèi)容如下所示:# 指定利用的驅(qū)

7、動(dòng)類hibernate.connection.driver_class = com.mysql.jdbc.driver r # 指定連接串hibernate.connection.url = jdbc:mysql:/localhost:3306/db # 指定連接的用戶名hibernate.connection.username = user # 指定連接的密碼hibernate.connection.password = password # 指定使用的方言hibernate.dialect = net.sf.hibernate.dialect.mysqldialect # 指定是否打印sq

8、l 語句hibernate.show_sql=true 在配置文件中包括了一系列屬性的配置,hibernate將依照這些屬性來連接。在 xml 格式的配置文件中,除了基本的hibernate配置信息,還可以指定具體的持久化類的映射文件,這可以避免將持久化類的配置文件硬編碼在程序中。xml 格式的配置文件的默認(rèn)文件名為hibernate.cfg.xml,一個(gè) xml 配置文件的示例如下所示:?xml version=1.0 encoding=utf-8?!doctype hibernate-configuration public -/hibernate/hibernate configurat

9、ion dtd 3.0/en http:/ 顯示執(zhí)行的sql 語句 - property name=show_sqltrue /property!- 連接字符串 - property name=connection.urljdbc:mysql:/localhost:3306/stu/property!- 連接的用戶名 - property name=connection.usernameroot /property!- 用戶密碼 - property name=connection.passwordroot /property!- 驅(qū)動(dòng) - property name=connection.d

10、river_classcom.mysql.jdbc.driver/property!- 選擇使用的方言 - property name=dialectorg.hibernate.dialect.mysqldialect/property!- 映射文件- mapping resource=com/stuman/domain/admin.hbm.xml /!- 映射文件 - mapping resource=com/stuman/domain/student.hbm.xml /session-factory/hibernate-configurationproperties形式的配置文件和xml

11、格式的配置文件能夠同時(shí)利用。當(dāng)同時(shí)利用兩種類型的配置文件時(shí), xml 配置文件中的設(shè)置會(huì)覆蓋properties配置文件的相同的屬性。對(duì)象標(biāo)識(shí)符號(hào)在關(guān)系表中,主鍵(primary key)用來識(shí)別記錄,并保證每條記錄的唯一性。在java 語言中,通過比較兩個(gè)變量所引用對(duì)象的內(nèi)存地址是不是相同,或比較兩個(gè)變量引用的對(duì)象值是不是相同來判定兩對(duì)象是不是相等。 hibernate為了解決二者之間的不同,利用對(duì)象標(biāo)識(shí)符 (oid )來標(biāo)識(shí)對(duì)象的唯一性。oid是關(guān)系中主鍵在java 對(duì)象模型中的等價(jià)物。在運(yùn)行時(shí),hibernate依照 oid 來維持 java 對(duì)象和表中記錄的對(duì)應(yīng)關(guān)系。 如下代碼所示,

12、三次挪用了session的 load()方式,別離加載 oid 為1 或3的 user 對(duì)象。transaction tx = session.begintransaction(); user user1 = (user)session.load(user.class,new long(1); user user2 = (user)session.load(user.class,new long(1); user user3 = (user)session.load(user.class,new long(3); system.out.println( user1 = user2 ); sys

13、tem.out.println( user1 = user3 ); 應(yīng)用程序在執(zhí)行上述代碼時(shí),第一次加載oid 為1 的 user 對(duì)象,從中查找id 為1 的記錄,然后創(chuàng)建相應(yīng)的 user實(shí)例,并把它保留在session緩存中,最后將該實(shí)例的引用賦值給變量user1 。第二次加載oid 為1 的對(duì)象時(shí),直接把session緩存中 oid 為1的實(shí)例的引用賦值給變量user2 。因此,表達(dá)式user1=user2的結(jié)果為 true 。標(biāo)識(shí)的生成可以使用不同的策略,表1為 hibernate內(nèi)置的標(biāo)識(shí)生成策略。表1 hibernate標(biāo)識(shí)生成策略標(biāo)識(shí)符生成器描述increment 適用于代理主鍵

14、。由hibernate自動(dòng)以遞增方式生成。identity 適用于代理主鍵。由底層生成標(biāo)識(shí)符。sequence 適用于代理主鍵。hibernate根據(jù)底層的序列生成標(biāo)識(shí)符,這要求底層支持序列。hilo 適用于代理主鍵。hibernate分局high/low算法生成標(biāo)識(shí)符。seqhilo 適用于代理主鍵。使用一個(gè)高/低位算法來高效的生成long,short或者int類型的標(biāo)識(shí)符。native 適用于代理主鍵。根據(jù)底層對(duì)自動(dòng)生成標(biāo)識(shí)符的方式,自動(dòng)選擇identity、sequence或hilo。適用于代理主鍵。hibernate采用128位的uuid算法生成標(biāo)識(shí)符。適用于代理主鍵。uuid被編碼成

15、一個(gè)16字符長(zhǎng)的字符串。assigned 適用于自然主鍵。由java應(yīng)用程序負(fù)責(zé)生成標(biāo)識(shí)符。foreign 適用于代理主鍵。使用另外一個(gè)相關(guān)聯(lián)的對(duì)象的標(biāo)識(shí)符。hibernate映射類型在對(duì)象 / 關(guān)系映射文件中,hibernate采納映射類型作為java 類型和 sql 類型的橋梁。 hibernate映射類型分為 2 種:內(nèi)置映射類型和自概念映射類型。1 、內(nèi)置映射類型hibernate對(duì)所有的java 原生類型、常用的 java 類型如 string 、 date 等都定義了內(nèi)置的映射類型。表2列出了 hibernate映射類型、對(duì)應(yīng)的java 類型以及對(duì)應(yīng)的標(biāo)準(zhǔn)sql 類型。表2 hib

16、ernate內(nèi)置映射類型hibernate映射類型java類型標(biāo)準(zhǔn)sql類型大小integer/int integer 4字節(jié)long bigint 8字節(jié)short smallint 2字節(jié)byte tinyint 1字節(jié)float float 4字節(jié)double double 8字節(jié)big_decimal numeric character char(1) 定長(zhǎng)字符string varchar 變長(zhǎng)字符boolean/ yes_no/true_false bit 布爾類型date date 日期timestamp timestamp 日期calendar timestamp 日期calen

17、dar_date date 日期binary byte blob blob text text clob serializable blob blob clob clob clob blob blob blob class varchar 定長(zhǎng)字符locale varchar 定長(zhǎng)字符timezone varchar 定長(zhǎng)字符currency varchar 定長(zhǎng)字符二、自概念映射類型hibernate提供了自定義映射類型接口,允許用戶以編程的方式創(chuàng)建自定義的映射類型。用戶自定義的映射類型需要實(shí)現(xiàn)net.sf.hibernate.usertype或 net.sf.hibernate.compo

18、siteusertype接口。具體的創(chuàng)建自定義映射類型的方法請(qǐng)參考hibernate官方文檔或相關(guān)資料,這里不再詳細(xì)介紹。hibernate 實(shí)體關(guān)聯(lián)關(guān)系映射-總結(jié)hibernate 實(shí)體關(guān)聯(lián)關(guān)系映射-總結(jié)花了三天的業(yè)余時(shí)刻,終于寫完了hibernate關(guān)聯(lián)關(guān)系映射的所有實(shí)例,感覺還應(yīng)該總結(jié)一下。hibernate映射關(guān)系錯(cuò)綜復(fù)雜,在實(shí)際中真的都能用到嗎?不用行嗎?在我眼里, hibernate提供這些映射關(guān)系,經(jīng)常使用確實(shí)是一對(duì)一和多對(duì)一,而且在能不用連接表的時(shí)候盡可能不要用連接表。多對(duì)多會(huì)用到,若是用到了, 應(yīng)該第一考慮底層數(shù)據(jù)庫設(shè)計(jì)是不是合理。在實(shí)際開發(fā)中,在 hibernate關(guān)聯(lián)關(guān)系

19、之外常常還有另外一種選擇方案,表各自作為單表映射,業(yè)務(wù)邏輯操縱外鍵關(guān)系(有時(shí)候確實(shí)是一個(gè)相關(guān)聯(lián)的列,但不必然要加外鍵約束),如此加倍靈活,而且數(shù)據(jù)的完整性一樣有保證。固然,“ 單表映射,業(yè)務(wù)操縱外鍵關(guān)系” 并非是說 hibernate的實(shí)體關(guān)聯(lián)功能是多余的,hibernate的實(shí)體關(guān)聯(lián)的優(yōu)勢(shì)很多,隨意拿本書都是講優(yōu)勢(shì),用好了會(huì)讓開發(fā)人員感覺更方便,此刻我也是兩種方案結(jié)合利用。比如關(guān)于不很確信的兩個(gè)實(shí)體,常常選用單表關(guān)聯(lián)。以前在初學(xué)hibernate尚未完全弄清楚這些關(guān)聯(lián)關(guān)系的時(shí)候,確實(shí)是用單表映射,業(yè)務(wù)操縱外鍵關(guān)系做的,發(fā)覺沒有任何問題,程序一樣運(yùn)行得專門好??戳诉@些是不是后悔浪費(fèi)時(shí)刻學(xué)習(xí)映射

20、關(guān)系了?呵呵,hibernate的 or mapping是hibernate的靈魂,我相信hibernate的開創(chuàng)人比咱們一樣人的明白得更深刻。只有學(xué)會(huì)了這些才能體會(huì)hibernate設(shè)計(jì)者的思想。學(xué)一個(gè)東西,不但自己寫代碼,還應(yīng)該能看懂他人的代碼才行。因此系統(tǒng)學(xué)習(xí)這些關(guān)聯(lián)映射仍是大有必要的。以上都是我自己的觀點(diǎn)。歡迎在此交流討論。hibernate在實(shí)際項(xiàng)目開發(fā)中,hbm.xml包括數(shù)據(jù)庫腳本都是通過xdoclet生成的, 在此不采納 xdoclet的目的是為了便于明白得這些映射模型。實(shí)體-數(shù)據(jù)表 -映射文件三者對(duì)照看,太直觀了。瞌睡了,臨時(shí)先寫到此,有新思路了再補(bǔ)上。 。 。hiberna

21、te關(guān)聯(lián)關(guān)系映射目錄 單向關(guān)聯(lián) 雙向關(guān)聯(lián)hibernate 一對(duì)一外鍵單向關(guān)聯(lián)事實(shí)上,單向 1-1 與 n-1的實(shí)質(zhì)是相同的,1-1 是 n-1的特例,單向 1-1 與 n-1的映射配置也超級(jí)相似。只需要將原先的many-to-one元素增加unique=true屬性,用于表示n 的一端也必需是唯一的, 在 n的一端增加了唯一的約束,即成為單向 1-1 。基于外鍵的單向1-1 的配置將與無連接表 n-1關(guān)聯(lián)的 many-to-one增加 unique=true屬性即可。一、模型介紹一個(gè)人( person )對(duì)應(yīng)一個(gè)地址(address )。二、實(shí)體(省略getter、setter方式)publ

22、ic class person11fk private int personid; private string name; private int age; private address11fk address11fk;public class address11fk private int addressid; private string addressdetail;三、表模型mysql desc address_11fk;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| address

23、id | int(11) | no | pri | null | auto_increment | addressdetail | varchar(255) | yes | | null | |+-+-+-+-+-+-+mysql desc person_11fk;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| personid | int(11) | no | pri | null | auto_increment | name | varchar(255) | yes | | null |

24、 | age | int(11) | yes | | null | | addressid | int(11) | yes | uni | null | |+-+-+-+-+-+-+四、生成的sql腳本createtableaddress_11fk ( addressid int (11) notnullauto_increment, addressdetail varchar(255) defaultnull , primarykey(addressid) ) engine=innodb auto_increment=2 defaultcharset=gbk; createtablepers

25、on_11fk ( personid int (11) notnullauto_increment, name varchar(255) defaultnull , age int (11) defaultnull , addressid int (11) defaultnull , primarykey(personid), keyfk68a8818f3f45aa77 (addressid), constraintfk68a8818f3f45aa77 foreignkey (addressid) referencesaddress_11fk (addressid) ) engine=inno

26、db auto_increment=2 defaultcharset=gbk; 五、映射方式:在 person 中添加 address 屬性,映射配置為: 六、測(cè)試方式publicclasstest_11fk publicstaticvoidmain(string args) person11fk p1= newperson11fk(); p1.setage(21); p1.setname(p1 ); address11fk add1=newaddress11fk(); add1.setaddressdetail(鄭州市經(jīng)三路); p1.setaddress11fk(add1); sessio

27、n session= hibernateutil.getcurrentsession(); transaction tx=session.begintransaction(); session.save(add1); session.save(p1); mit(); hibernateutil.closesession(); 七、測(cè)試結(jié)果1) :正常保留 . 推薦這么干 ! session.save(add1); session.save(p1);hibernate: insert into address_11fk (addressdetail) values (?)hibernate: i

28、nsert into person_11fk (name, age, addressid) values (?, ?, ?)2) :正常保留 . session.save(p1); session.save(add1);hibernate: insert into person_11fk (name, age, addressid) values (?, ?, ?)hibernate: insert into address_11fk (addressdetail) values (?)hibernate: update person_11fk set name=?, age=?, addre

29、ssid=? where personid=?3) :正常保留 ./ session.save(p1); session.save(add1);hibernate: insert into address_11fk (addressdetail) values (?)4) :發(fā)生異樣 , 不能保留 . session.save(p1);/ session.save(add1);hibernate: insert into person_11fk (name, age, addressid) values (?, ?, ?)hibernate一對(duì)一主鍵單向關(guān)聯(lián)1-1 的關(guān)聯(lián)可以基于主鍵關(guān)聯(lián),但基

30、于主鍵關(guān)聯(lián)的持久化類不能擁有自己的主鍵生成策略,它的主鍵由關(guān)聯(lián)類負(fù)責(zé)生成。另外,另外,增加one-to-one元素來關(guān)聯(lián)屬性,必須為one-to-one元素增加 constrained=true屬性,表明該類主鍵由關(guān)聯(lián)類生成。一、模型介紹一個(gè)人( person )對(duì)應(yīng)一個(gè)地址(address )。二、實(shí)體(省略getter、setter方法)public class person11pk private int personid; private string name; private int age; private address11pk address11pk;public class

31、 address11pk private int addressid; private string addressdetail;三、表模型mysql desc address_11pk;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| addressid | int(11) | no | pri | null | auto_increment | addressdetail | varchar(255) | yes | | null | |+-+-+-+-+-+-+mysql desc per

32、son_11pk;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| personid | int(11) | no | pri | | | name | varchar(255) | yes | | null | | age | int(11) | yes | | null | |+-+-+-+-+-+-+四、生成的sql腳本/* formatted on 2007/08/22 14:40 (qp5 v5.50) */create table address_11pk ( addressid i

33、nt(11) not null auto_increment, addressdetail varchar(255) default null, primary key (addressid) engine=innodb auto_increment=2 default charset=gbk;/* formatted on 2007/08/22 14:41 (qp5 v5.50) */create table person_11pk ( presonid int(11) not null, name varchar(255) default null, age int(11) default

34、 null, primary key (presonid), key fk68a882c591bb393e (presonid), constraint fk68a882c591bb393e foreign key (presonid) references address_11pk (addressid) engine=innodb default charset=gbk;五、映射方法:在person 中配置 id 生成策略為: address11pk . address11pk 六、測(cè)試方法public class test_11pk public static void main(str

35、ing args) person11pk p1=new person11pk(); p1.setage(21); p1.setname(p1); address11pk add1=new address11pk(); add1.setaddressdetail(鄭州市經(jīng)三路); p1.setaddress11pk(add1); session session= hibernateutil.getcurrentsession(); transaction tx=session.begintransaction(); session.save(add1); session.save(p1); mi

36、t(); hibernateutil.closesession(); 七、測(cè)試結(jié)果1) :正常保存 . 推薦這么干 ! session.save(add1); session.save(p1);hibernate: insert into address_11fk (addressdetail) values (?)hibernate: insert into person_11fk (name, age, addressid) values (?, ?, ?)2) :正常保存 . session.save(p1); session.save(add1);hibernate: insert i

37、nto person_11fk (name, age, addressid) values (?, ?, ?)hibernate: insert into address_11fk (addressdetail) values (?)hibernate: update person_11fk set name=?, age=?, addressid=? where personid=?3) :正常保存 ./ session.save(p1); session.save(add1);hibernate: insert into address_11fk (addressdetail) value

38、s (?)4) :發(fā)生異常 , 不能保存 . session.save(p1);/ session.save(add1);hibernate: insert into person_11fk (name, age, addressid) values (?, ?, ?)hibernate一對(duì)一連接表單向關(guān)聯(lián)這種情況很少見, 但 hibernate同樣允許采用連接表關(guān)聯(lián)1-1. 有連接表的 1-1 同樣只需要將n-1的 many-to-one元素增加unique=true屬性即可。一、模型介紹一個(gè)人( person )對(duì)應(yīng)一個(gè)地址(address )。二、實(shí)體(省略getter、setter方法

39、)public class person11tab private int personid; private string name; private int age; private address11tab address11tab;public class address11tab private int addressid; private string addressdetail;三、表模型mysql desc address_11tab;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-

40、+| addressid | int(11) | no | pri | null | auto_increment | addressdetail | varchar(255) | yes | | null | |+-+-+-+-+-+-+mysql desc join_11tab;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| personid | int(11) | no | pri | | | address11tab | int(11) | yes | uni | null | |+-

41、+-+-+-+-+-+mysql desc person_11tab;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+| personid | int(11) | no | pri | null | auto_increment | name | varchar(255) | yes | | null | | age | int(11) | yes | | null | |+-+-+-+-+-+-+四、生成的sql腳本/* formatted on 2007/08/20 16:52 (qp5 v5

42、.50) */create table join_11tab ( personid int(11) not null, address11tab int(11) default null, primary key (personid), unique key address11tab (address11tab), key fk6b44be20c4cc3d33 (address11tab), key fk6b44be209049bb1f (personid), constraint fk6b44be209049bb1f foreign key (personid) references per

43、son_11tab (personid), constraint fk6b44be20c4cc3d33 foreign key (address11tab) references address_11tab (addressid) engine=innodb default charset=gbk;/* formatted on 2007/08/20 16:53 (qp5 v5.50) */create table address_11tab ( addressid int(11) not null auto_increment, addressdetail varchar(255) defa

44、ult null, primary key (addressid) engine=innodb auto_increment=2 default charset=gbk;/* formatted on 2007/08/20 16:53 (qp5 v5.50) */create table person_11tab ( personid int(11) not null auto_increment, name varchar(255) default null, age int(11) default null, primary key (personid) engine=innodb aut

45、o_increment=2 default charset=gbk;五、映射方法:在 person 中添加 address 屬性,映射配置為: 六、測(cè)試方法public class test_11tab public static void main(string args) person11tab p1=new person11tab(); p1.setage(21); p1.setname(p1); address11tab add1=new address11tab(); add1.setaddressdetail(鄭州市經(jīng)三路); p1.setaddress11tab(add1); s

46、ession session= hibernateutil.getcurrentsession(); transaction tx=session.begintransaction(); session.save(add1); session.save(p1); mit(); hibernateutil.closesession(); 七、測(cè)試結(jié)果1) :正常保存 . 推薦這么干 ! session.save(add1); session.save(p1);hibernate: insert into address_11tab (addressdetail) values (?)hibern

47、ate: insert into person_11tab (name, age) values (?, ?)hibernate: insert into join_11tab (address11tab, personid) values (?, ?)2) :正常保存 . session.save(p1); session.save(add1);hibernate: insert into person_11tab (name, age) values (?, ?)hibernate: insert into join_11tab (address11tab, personid) value

48、s (?, ?)hibernate: insert into address_11tab (addressdetail) values (?)hibernate: update join_11tab set address11tab=? where personid=?3) :正常保存 ./ session.save(p1); session.save(add1);hibernate: insert into address_11tab (addressdetail) values (?)4) :發(fā)生異常 , 不能保存 . session.save(p1);/ session.save(add

49、1);hibernate: insert into person_11tab (name, age) values (?, ?)hibernate: insert into join_11tab (address11tab, personid) values (?, ?)hibernate一對(duì)多外鍵單向關(guān)聯(lián)這種情況很少見, 但 hibernate同樣允許采用連接表關(guān)聯(lián)1-1. 有連接表的 1-1 同樣只需要將n-1的 many-to-one元素增加unique=true屬性即可。一、模型介紹一個(gè)人( person )對(duì)應(yīng)多個(gè)地址(address ),比如家庭地址、公司地址。二、實(shí)體(省略get

50、ter、setter方法)public class person1nfk implements serializable private int personid; private string name; private int age; private set addresses=new hashset();public class address1nfk implements serializable private int addressid; private string addressdetail;三、表模型mysql desc address_1nfk;+-+-+-+-+-+-+

51、| field | type | null | key | default | extra |+-+-+-+-+-+-+| addressid | int(11) | no | pri | null | auto_increment | addressdetail | varchar(255) | yes | | null | | personid | int(11) | yes | mul | null | |+-+-+-+-+-+-+mysql desc person_1nfk;+-+-+-+-+-+-+| field | type | null | key | default | ext

52、ra |+-+-+-+-+-+-+| personid | int(11) | no | pri | null | auto_increment | name | varchar(255) | yes | | null | | age | int(11) | yes | | null | |+-+-+-+-+-+-+四、生成的sql腳本 /* formatted on 2007/08/21 10:06 (qp5 v5.50) */ create table address_1nfk ( addressid int(11) not null auto_increment, addressdeta

53、il varchar(255) default null, addresses int(11) default null, primary key (addressid), key fk9b93456dc08d1667 (addresses), constraint fk9b93456dc08d1667 foreign key (addresses) references person_1nfk (personid) ) engine=innodb auto_increment=3 default charset=gbk; /* formatted on 2007/08/21 10:07 (q

54、p5 v5.50) */ create table person_1nfk ( personid int(11) not null auto_increment, name varchar(255) default null, age int(11) default null, primary key (personid) ) engine=innodb auto_increment=2 default charset=gbk;五、映射方法:在實(shí)體類person 里面添加address 的集合,即可形成一對(duì)多關(guān)系。 六、測(cè)試方法public class test_1nfk public sta

55、tic void main(string args) address1nfk add1=new address1nfk(); address1nfk add2=new address1nfk(); person1nfk p=new person1nfk(); add1.setaddressdetail(鄭州市經(jīng)三路); add2.setaddressdetail(合肥市宿州路); p.setname(wang); p.setage(30); p.getaddresses().add(add1); p.getaddresses().add(add2); session session= hibe

56、rnateutil.getcurrentsession(); transaction tx=session.begintransaction(); session.save(add1); session.save(add2); session.save(p); mit(); hibernateutil.closesession(); 七、測(cè)試結(jié)果1) :正常保存 ./ session.save(add1);/ session.save(add2); session.save(p);hibernate: insert into person_1nfk (name, age) values (?,

57、 ?)hibernate: insert into address_1nfk (addressdetail) values (?)hibernate: insert into address_1nfk (addressdetail) values (?)hibernate: update address_1nfk set personid=? where addressid=?hibernate: update address_1nfk set personid=? where addressid=?2) :正常保存 . session.save(add1); session.save(add

58、2); session.save(p);hibernate: insert into address_1nfk (addressdetail) values (?)hibernate: insert into address_1nfk (addressdetail) values (?)hibernate: insert into person_1nfk (name, age) values (?, ?)hibernate: update address_1nfk set personid=? where addressid=?hibernate: update address_1nfk se

59、t personid=? where addressid=?3) :正常保存 . session.save(add1); session.save(add2);/ session.save(p);hibernate: insert into address_1nfk (addressdetail) values (?)hibernate: insert into address_1nfk (addressdetail) values (?)hibernate一對(duì)多連接表單向關(guān)聯(lián)一、模型介紹一個(gè)人( person )對(duì)應(yīng)多個(gè)地址(address ),比如家庭地址、公司地址。二、實(shí)體(省略gett

60、er、setter方法)public class person1ntab private int personid; private string name; private int age; private set addresses=new hashset();public class address1nfk implements serializable private int addressid; private string addressdetail;三、表模型mysql desc join_1ntab;+-+-+-+-+-+-+| field | type | null | ke

溫馨提示

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

評(píng)論

0/150

提交評(píng)論