紙飛機(jī)

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            22 隨筆 :: 28 文章 :: 30 評論 :: 0 Trackbacks
           原貼網(wǎng)址: http://www.jdon.com/jivejdon/thread/22244.html

          (一)對象之間的關(guān)系:
          1. 依賴:
          依賴對象通過調(diào)用被依賴對象的方法來獲得服務(wù)。一種比較松散的關(guān)系,并且是短期的。我們的過程與對象往往依賴與我們的實體域?qū)ο蟆H缭趕truts 的 action中調(diào)用模型層的方法。
          2. 關(guān)聯(lián)
          它使一個類指到另一個類的屬性。長期的
          3. 聚合
          聚合關(guān)系是關(guān)聯(lián)關(guān)系的一種,是強的關(guān)聯(lián)關(guān)系。聚合是整體和部分之間的關(guān)系。
          4. 組合
          也叫合成關(guān)系,組成關(guān)系是關(guān)聯(lián)關(guān)系的一種,是比聚合關(guān)系強的關(guān)系。對象負(fù)責(zé)代表部分的對象的生命周期。
          注:既然聚合,組合關(guān)系屬于關(guān)聯(lián)關(guān)系,那么如何區(qū)分一般關(guān)聯(lián)關(guān)系,聚合關(guān)系和組合關(guān)系呢?
          一般關(guān)聯(lián):只要一個對象聯(lián)系到另外一個對象就形成了關(guān)聯(lián)關(guān)系。如:人和他的貓,黑豹樂隊和竇魏,pc機(jī)和顯示器。
          聚合關(guān)系:一種強關(guān)聯(lián)關(guān)系,它要求有部分和整體的關(guān)系,并且沒有了整體部分也可以獨立存在。在上面三個例子中人和它的貓顯然沒有部分和整體的關(guān)系,所以只能是一般的關(guān)聯(lián)關(guān)系。而黑豹樂隊和竇魏,竇魏等人組成了黑豹樂隊即:竇魏和黑豹是整體和部分的關(guān)系。而
          竇魏脫離了黑豹(早就離開了)更或者黑豹不存在了那么竇魏仍然可以以音樂人的身份存在(即對象仍然可以獨立存在)所以它屬于聚合關(guān)系。組成關(guān)系是可以共享的。(竇魏也可以加入其他樂隊)。
          組合關(guān)系:一種更強的整體和部分的關(guān)系。它并且要求代表整體的對象負(fù)責(zé)代表部分的對象的生命周期,組成關(guān)系是不能共享的。如:pc機(jī)和顯示器的關(guān)系。
          我覺得:如果兩個實體是整體和部分的關(guān)系,那么它們到底是聚合還是組合,這取決于你的需求。比如說:pc機(jī)和顯示器的關(guān)系,如果你的系統(tǒng)中,顯示器脫離了 pc機(jī)就不存在意義了,也可以說:所有顯示器的訪問都是通過pc機(jī)進(jìn)行的,那么你可以把關(guān)系設(shè)定為組合(如你在為一個只買品牌機(jī)的代理商作系統(tǒng)你可能是可以這么作的)。如果你的顯示器脫離的pc機(jī)仍然可以獨立存在,也就是說在系統(tǒng)中可以直接訪問顯示器對象,那么你可以將關(guān)系設(shè)為聚合(如你在為一個買散件的代理商作系統(tǒng)你可能是可以這么作的)
          5. 繼承
          這個我不想多講了,用過面向?qū)ο蟮恼Z言都應(yīng)該知道。
          (二)關(guān)系數(shù)據(jù)庫的關(guān)系
          一對一
          一對多
          多對一
          多對多
          (三)o/r mapping策略
          1.繼承:
          對于繼承關(guān)系一般有三種策略:
          策略1繼承樹的每個類對應(yīng)一個表<joined-subclass >
          共享主鍵
          策略2繼承樹的根類對應(yīng)一個表<discriminator ><subclass >
          需要添加一個識別字段
          策略3繼承樹的葉子類對應(yīng)一個表
          不支持多態(tài)查詢
          2.關(guān)聯(lián)
          2.1一對一
          一半有兩種策略:
          策略1:唯一的外鍵
          <many-to-one>+unique=”true” (唯一的外鍵)
          <one-to-one>
          策略2:共享主鍵
          <one-to-one>
          <one-to-one><constrained=”true”> (既是主鍵又是外鍵)
          注意:生成方式需要用:foreign
          2.2一對多(無需多說)
          2.3多對一(無需多說)
          2.4多對多
          策略1:A,B表多對多的關(guān)系需要引入C表。
          C表中的所有屬性即為主鍵又為外鍵分別參照A,B兩表。
          C表中不可以有其他屬性
          策略2:將多對多拆分成兩個一對多:
          A,B對象多對多的關(guān)系需要引入C對象。使得A,B兩對象與C對象的關(guān)系為一對多。對應(yīng)數(shù)據(jù)庫中:A,B表多對多的關(guān)系需要引入C表。A,B兩表與C表的關(guān)系為一對多。
          C表又自己的主鍵
          C表中又非主鍵的外鍵分別參照A,B兩表。
          C表中不可以有其他屬性
          如;學(xué)生 ,課程為多對多的關(guān)系 那么引入學(xué)生選課。
          注意:策略1和策略2的不同在于:策略2引入了新的對象而策略1沒有。這是因為這樣:策略1的c表不能又自己的東西。而策略2有。
          2.5其他
          上面說過:聚合與組成是關(guān)聯(lián)的一種所以他們也符合以上策略。
          特別的:當(dāng)用到組合關(guān)系的是否我們可用用到hibernate的“組件”<component>.由于“組件”它完全可以滿足組成關(guān)系的強關(guān)聯(lián)。
          3.依賴
          一般不在實體域?qū)ο笾畜w現(xiàn)。

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2005年08月23日 09:16 回復(fù)
          jane830527 發(fā)表文章: 1/ 注冊時間: 2005年08月23日 09:14
          好!

           

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2005年08月23日 09:33 回復(fù)
          kkkk 發(fā)表文章: 3/ 注冊時間: 2003年04月22日 13:50
          支持

           

          O/R MAPPING (HIBERNATE)方法小結(jié) (補充內(nèi)容): 發(fā)表: 2005年08月23日 09:54 回復(fù)
          xyz 發(fā)表文章: 38/ 注冊時間: 2005年08月22日 20:17
          另外我看到了一種”鍵關(guān)聯(lián)”的方法,感覺很有道理。我理解了一下總結(jié)如下:
          1. 一般關(guān)聯(lián):
          這種方法對于一般的關(guān)聯(lián)總是引入c表(另外的一張表)僅僅表示關(guān)系。
          C表的主鍵有分別指向A,B兩表(外鍵)。當(dāng)指向一方的外鍵unique=”true”即唯一,那么這一方為“一”,反之為“多”的一方。這樣就可以形成一般的關(guān)聯(lián)關(guān)系。但是注意的是:c表不映射為對象。C表也沒有自己的屬性。
          2. 聚合和組成
          當(dāng)實體A的非主鍵列中有一個引自實體B的時候,這種關(guān)系是B聚合A。如果這種引用是強制性的,則是合成關(guān)系,否則為聚合關(guān)系。是否為強制性,只需要將引用列設(shè)為非空即可;
          3. 繼承
          當(dāng)實體A的主鍵引用自實體B的時候(即為外鍵),那么A繼承 B。
          總結(jié):我覺得O/RM的方法有很多,我們可以看到“按外鍵“的方法思路很清晰。但是它在解決一般的關(guān)聯(lián)的時候總是引入另外一張表這樣勢必影響效率。另外,既然聚合和組合是關(guān)聯(lián)的一種那么即使是組合關(guān)系我也把它看成一般關(guān)聯(lián),也不算錯的。關(guān)系數(shù)據(jù)庫一開始就不是為了面向?qū)ο蟮恼Z言服務(wù)的,所以我們在這里映射無論那種方法似乎都不能說是完全的,正確無誤完成了O/RM。
          所以我覺得一切都要看我們的項目需求。因地制宜!

           

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2005年08月24日 10:50 回復(fù)
          robert8292 發(fā)表文章: 1/ 注冊時間: 2005年08月24日 10:47
          “策略2:共享主鍵”關(guān)于這個問題昨天剛被問到,憑著項目中的記憶,勉強答對了,汗。

           

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2005年08月31日 14:07 回復(fù)
          xxaxxx 發(fā)表文章: 1/ 注冊時間: 2005年08月31日 14:05
          水平不錯!

           

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2006年01月02日 21:38 回復(fù)
          banq 發(fā)表文章: 8377/ 注冊時間: 2002年08月03日 17:08
          該文章好就好在它從設(shè)計角度來看待hibernate,對象關(guān)系和數(shù)據(jù)庫之間的存在阻抗,如何通過hibernate配置設(shè)置,該文從這個角度描述。

          如果你看懂本文,并且覺得很好,說明你已經(jīng)掌握了使用Hibernate的真諦。

          如果你不以為然,或者沒看懂,雖然你也在用Hibernate,說明你只是將hiberante作為數(shù)據(jù)庫傀儡,請盡快轉(zhuǎn)變你的思路到域模型驅(qū)動分析設(shè)計上來。

           

          Re: 我的O/R MAPPING (HIBERNATE)方法小結(jié) 發(fā)表: 2006年01月02日 21:40 回復(fù)
          banq 發(fā)表文章: 8377/ 注冊時間: 2002年08月03日 17:08
          從另外一個方面說:使用hibernate需要相當(dāng)?shù)脑O(shè)計功底,而非傳統(tǒng)的數(shù)據(jù)庫功底,如果你沒有這個功底,會誤用hibernate,反而是一種損害。

          http://www.jdon.com/jive/article.jsp?forum=91&thread=24451
          posted on 2007-10-28 12:36 紙飛機(jī) 閱讀(237) 評論(0)  編輯  收藏 所屬分類: Hibernate

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 驻马店市| 阜阳市| 阿拉善左旗| 建平县| 安塞县| 邢台市| 长沙市| 紫金县| 习水县| 额敏县| 张北县| 岑巩县| 荆门市| 清丰县| 微山县| 喀喇沁旗| 天镇县| 和平区| 米易县| 湖南省| 道真| 夏邑县| 彩票| 新乡市| 新乐市| 许昌市| 云林县| 嘉兴市| 六枝特区| 阳城县| 洞头县| 渝中区| 分宜县| 岳阳市| 甘肃省| 攀枝花市| 大荔县| 元阳县| 乐业县| 瓮安县| 牟定县|