學(xué)習(xí)筆記20170601">【PMP】學(xué)習(xí)筆記20170601
853
2025-04-01
hibernate學(xué)習(xí)筆記3
學(xué)習(xí)課程:
13_
多對(duì)一關(guān)聯(lián)映射.avi
hibernate_03_manyToone
14_
一對(duì)一主鍵關(guān)聯(lián)映射_單向.avi
Hibernate_04_oneToone_pk_1
14_
一對(duì)一主鍵關(guān)聯(lián)映射_雙向.avi
Hibernate_05_oneToone_pk_2
16_
一對(duì)一唯一外鍵關(guān)聯(lián)映射_單向.avi
Hibernate_06_oneToone_upk_1
16_
一對(duì)一唯一外鍵關(guān)聯(lián)映射_
雙
向.avi
Hibernate_07_oneToone_upk_2
學(xué)習(xí)內(nèi)容:
多對(duì)一關(guān)聯(lián)映射
一對(duì)一主鍵關(guān)聯(lián)映射_單向
一對(duì)一主鍵關(guān)聯(lián)映射_雙向
一對(duì)一唯一外鍵關(guān)聯(lián)映射_單向
一對(duì)一唯一外鍵關(guān)聯(lián)映射_雙向
一對(duì)一主鍵關(guān)聯(lián)映射_單向
一對(duì)一主鍵關(guān)聯(lián)映射_雙向
一對(duì)一唯一外鍵關(guān)聯(lián)映射_單向
一對(duì)一唯一外鍵關(guān)聯(lián)映射_雙向
1.
多對(duì)一關(guān)聯(lián)映射
多對(duì)一關(guān)聯(lián)映射
關(guān)聯(lián)映射的本質(zhì):
*
將關(guān)聯(lián)關(guān)系映射到數(shù)據(jù)庫(kù)(關(guān)聯(lián)關(guān)系:對(duì)象模型在內(nèi)存中的一個(gè)或多個(gè)引用)
在多的一段的映射文件加入
在"多"的一端加入字段作為外鍵參照"一"端
重要屬性(cascade)級(jí)聯(lián)
*
級(jí)聯(lián)的意思是指定兩個(gè)而對(duì)象之間的操作聯(lián)動(dòng)關(guān)系,對(duì)一個(gè)對(duì)象執(zhí)行了操作之后,對(duì)其指定的
級(jí)聯(lián)對(duì)象也需要執(zhí)行想同的操作
*
總工可以取值為:?all、none、save-update、delete
*all——
代表在所有的情況下都執(zhí)行級(jí)聯(lián)操作
*none——
在所有的情況下都不執(zhí)行級(jí)聯(lián)操作
*save-update——
在保存和更新的時(shí)候執(zhí)行級(jí)聯(lián)操作
*delete——
在刪除的時(shí)候執(zhí)行級(jí)聯(lián)操作
*
如: cascade="all"/> persistent 狀態(tài)的對(duì)象不能引用?transisent狀態(tài)的對(duì)象 testLoad1 查詢保存在user_message中的數(shù)據(jù)信息,以及相關(guān)外鍵的信息 1. 修改原先定義好的User類中id屬性類型為int 2. 在User.hbm.xml文件中添加字段 3. 新建Group.java實(shí)體類添加字段?id?name?以及get和set方法?id類型int?name類型String,并且生成相應(yīng)的配置文件,其中生成策略為native 4. 執(zhí)行testExport.java 測(cè)試類中方法的主要代碼片段: 所有測(cè)試方法,以及其作用 testManyToOne1 不保存Group對(duì)象,會(huì)報(bào)錯(cuò) testManyToOne2 保存Group對(duì)象,不會(huì)報(bào)錯(cuò) testManyToOne3 不保存Group對(duì)象,但是設(shè)置cascade屬性為all,不會(huì)報(bào)錯(cuò) testLoad1 查詢保存在user_message中的數(shù)據(jù)信息,以及相關(guān)外鍵的信息 testManyToOne1 Group?group?=?new?Group();group.setName(?"科學(xué)家"?);User?user?=?new?User();user.setName(?"愛(ài)因斯坦"?);user.setAge(?20?);user.setCreateTime(?new?Date()?);user.setExpireTime(?new?Date()?);user.setGroup(?group?);?session.save(?user?); testManyToone2 Group?group?=?new?Group();group.setName(?"科學(xué)家"?);session.save(?group?);User?user?=?new?User();user.setName(?"愛(ài)因斯坦"?);user.setAge(?20?);user.setCreateTime(?new?Date()?);user.setExpireTime(?new?Date()?);user.setGroup(?group?);session.save(?user?); testManyToone3 Group?group?=?new?Group();group.setName(?"科學(xué)家"?);User?user?=?new?User();user.setName(?"愛(ài)因斯坦"?);user.setAge(?20?);user.setCreateTime(?new?Date()?);user.setExpireTime(?new?Date()?);user.setGroup(?group?);session.save(?user?); testLoad() 測(cè)試結(jié)果: Hibernate: 向?user_message中發(fā)送查詢語(yǔ)句 愛(ài)因斯坦 Hibernate: 向 group_message 表發(fā)送查詢語(yǔ)句 科學(xué)家 User?user?=?(?User?)session.get(?User.class?,??1?);System.out.println(?user.getName()?);System.out.println(?user.getGroup().getName()?); 2. 一對(duì)一主鍵關(guān)聯(lián)映射_單向 一對(duì)一關(guān)聯(lián)映射(one-to-one) * 兩個(gè)對(duì)象之間是一對(duì)一的關(guān)系,如Person—IdCard * 有兩種策略可以實(shí)現(xiàn)一對(duì)一的關(guān)聯(lián)映射 * 主鍵關(guān)聯(lián):即讓兩個(gè)對(duì)象具有相同的主鍵值,?以表明他們之間的一一對(duì)應(yīng)的關(guān)系, 這樣可以避免多余的字段被創(chuàng)建;?數(shù)據(jù)庫(kù)不會(huì)有額外的字段來(lái)維護(hù)它們之間的關(guān) 系,僅通過(guò)表的主鍵來(lái)關(guān)聯(lián) * 唯一外鍵關(guān)聯(lián):外鍵關(guān)聯(lián),本來(lái)是用于多對(duì)一的配置,但是如果加上唯一的限制之 后,也可以用來(lái)表示一對(duì)一關(guān)聯(lián)關(guān)系。 單向關(guān)聯(lián)?:只能一端訪問(wèn)另一段。 雙向關(guān)聯(lián)?:兩端可以進(jìn)行互相訪問(wèn)。 hibernate_04_oneToone_pk_1 例子 Person :(int?id?),(String?name),(IdCard?idCard) IdCard :(int?id?),(?String?cardNo) Person 中的id字段作為一個(gè)外鍵參照IdCard中的id字段, 即Persion中的id字段的數(shù)據(jù)來(lái)源于IdCard中的id字段值,共享IdCard的主鍵 設(shè)置Person.hbm.xml生成策略為foreign,加參數(shù)idCard 只是Hibernate怎么加載它的關(guān)聯(lián)對(duì)象,默認(rèn)根據(jù)主鍵加載 (外鍵約束,表名當(dāng)前主鍵上存在一個(gè)約束,Person 的主鍵作為外鍵參照IdCard)?> 一對(duì)一關(guān)聯(lián)映射中默認(rèn)了cascade屬性 所以不用保存IdCard就能夠運(yùn)行成功。 session.save(person); 執(zhí)行過(guò)該語(yǔ)句后Hibernate發(fā)送insert?into?idCard_message 當(dāng)提交事務(wù)以后Hibernate再發(fā)送insert?into?person_message session.get( 類名,id值); 通過(guò)人來(lái)查找身份證號(hào)。 測(cè)試類,方法的主要代碼: testSave() Group?group?=?new?Group();group.setName(?"科學(xué)家"?);User?user?=?new?User();user.setName(?"愛(ài)因斯坦"?);user.setAge(?20?);user.setCreateTime(?new?Date()?);user.setExpireTime(?new?Date()?);user.setGroup(?group?); testLoad() Person?person?=?(Person)?session.get(?Person.class?,?3?);System.out.println(?"person.name?=?"?+?person.getName()?);System.out.println(?"person.idCard?=?"?+person.getIdCard().getCardNo()); 2. 一對(duì)一主鍵關(guān)聯(lián)映射_雙向 Person?<---->?IdCard 在IdCard端持有person的引用 在IdCard.hbm.xml中加入 指向person?指示Hibernate如何加載person 默認(rèn)根據(jù)加載主鍵 進(jìn)行加載的時(shí)候,使用IdCard查詢Person.name 只發(fā)送一條查詢語(yǔ)句,fatch默認(rèn)join,只發(fā)送一條外連接 相關(guān)主要代碼: testSave () 添加數(shù)據(jù) IdCard?idCard?=?new?IdCard();idCard.setCardNo(?"1111111"?);Person?person?=?new?Person();person.setName(?"太陽(yáng)星"?);person.setIdCard(?idCard?); testLoad1 () IdCard --> Person 進(jìn)行查詢數(shù)據(jù) IdCard?idCard?=?(IdCard)?session.get(?IdCard.class,?1?);System.out.println(?"person.name?=?"?+?idCard.getPerson().getName()?);System.out.println(?"person.cardNo"?+?idCard.getCardNo()?); testLoad2 () Person --> IdCard 進(jìn)行查詢數(shù)據(jù) Person?person?=?(Person)?session.get(?Person.class?,?1?);System.out.println(?"Person.name?=?"?+?person.getName()?);System.out.println(?"Person.cardNo?=?"?+?person.getIdCard().getCardNo()?); 3. 一對(duì)一唯一外鍵關(guān)聯(lián)映射——單向 多對(duì)一映射的特例 hibernate04_oneToone_upk_1 person_message 與idCard_message?增加字段IdCard,person主鍵自增 顯示多的一端的多重性唯一 相關(guān)主要代碼: testeSave() 添加數(shù)據(jù) IdCard?idCard?=?new?IdCard();idCard.setCardNo(?"1111111"?);session.save(?idCard?);Person?person?=?new?Person();person.setName(?"太陽(yáng)星"?);person.setIdCard(?idCard?); testLoad() 從 Person --> IdCard Person?person?=?(Person)?session.get(?Person.class?,?1?);?System.out.println(?"person.name?=?"?+?person.getName()?);System.out.println(?"person.idCard?=?"?+?person.getIdCard().getCardNo()); 4. 一對(duì)一唯一外鍵關(guān)聯(lián)映射——雙向 在idcard中加入字段person 采用one-to-one來(lái)進(jìn)行映射?,指示hibernate如何加載其關(guān)聯(lián)對(duì)象,默認(rèn)根據(jù)主鍵加載person,因?yàn)橥怄I 關(guān)聯(lián)映射中采用,因?yàn)閮蓚€(gè)實(shí)體采用的是person的外鍵進(jìn)行維護(hù)的關(guān)系,所以不能指定主鍵加載person, 而要根據(jù)person的外鍵進(jìn)行加載,所以設(shè)置property-ref屬性來(lái)指定向哪個(gè)字段進(jìn)行比較 相關(guān)主要代碼: testSave () 添加數(shù)據(jù) IdCard?idCard?=?new?IdCard();idCard.setCardNo(?"1111112"?);session.save(?idCard?);Person?person?=?new?Person();person.setName(?"太陽(yáng)星"?);person.setIdCard(?idCard?); testLoad1 () IdCard --> Person 進(jìn)行查詢數(shù)據(jù) IdCard?idCard?=?(IdCard)?session.get(?IdCard.class?,?1?);System.out.println(?"person.name?=?"?+?idCard.getPerson().getName()?);System.out.println(?"person.idCard?=?"?+?idCard.getCardNo()?); testLoad2 () Person --> IdCard 進(jìn)行查詢數(shù)據(jù) Person?person?=?(Person)?session.get(?Person.class?,??1?);?System.out.println(?person.getName()?+?"???"?+?person.getIdCard().getCardNo()?); 提示: 修改one-to-one中的屬性不用重新生成表 修改many-to-one中的屬性需要重新生成表 XML
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。