<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    one-to-one的效率問題,用one-to-many來替代?

             由于最近在把以前的一個設計移到hibernate上來,所以需要用到one-to-one,因為在以前的設計中需要用到在一個主表中對于多個子表的主鍵關聯,所以一開始就想到了one-to-one的應用,覺得這樣解決不但不會引起以前數據設計的改變,也能夠很好的利用hibernate所帶來的OR優勢,可是當實際使用的時候發現,在插入數據的時候可以有選擇的在任意子表中進行插入,所有的結果都在原來的預期之中,但是在查詢的時候,比如說只查詢主表中的內容

             From tableMain

    僅僅執行看起來十分簡單的一條語句,你所期望的是他緊緊查詢T_MAIN這張主表,可是結果確實hibernate通過多個外連接將所有的子表一口氣的全部查詢出來

             select * from t_main main outer join t_sub1 sub1 on main.id = sub1.id outer join t_sub2 sub2 on main.id = sub2.id...

     如此的效率絕對讓你頭痛不已,不僅如此,如果你通過首先獲得子表t_sub1的某個主鍵ID,然后通過這個主鍵查詢出子表對象,在關聯至住表,同樣的情況又會發生,又會生成類似的SQL語句,這樣一來看來對于這個設計應用one-to-one本身就是一種錯誤,是這樣嗎?

             或許有人認為我們在每個one-to-one中加入lazy="true"這個屬性會杜絕上述情況的發生,經過筆者的證實即便你加入了lazy="true",也不會帶來任何的改變;又或者在hibernate.config中加入fetch depth屬性以及在每個關聯中設置outer-join="false",這些都不會引起本質上的變化,加入outer-join="false"其實結果只是將原有的outer join語句改變成多條sql語句而已,并沒發生什么本質變化,反而效率更低了。

             該怎么辦呢?我們先仔細研究一下one-to-one的概念,one to one代表一對一,在一般的模型中很少會遇到one-to-one這種概念,因為他十分強調一對一的概念,就好比一個人他只有一個身體和一個頭而已,頭和身體是十分好的例子,因為有身體必定只有一個頭,而且說到了身體必定要說頭,就好像看了某個女孩的身材必定想知道她的長相如何(-_-),所以在這時我們使用one-to-one,因為這種一對一的關系是很強的,而且從對象中取得body必定會取得他所關聯的head,這樣的情況下使用outer-join是十分方便和有效率的,因為它使用了outer join查詢從而避免了兩條到數據庫的查詢語句,而且在這種情況下也只需要在body_hbm.xml中設置一個one-to-one即可,所以在這種確實是一對一而且在主表中一對一的關聯個數(即主表中one-to-one標簽)十分少的情況下,使用one-to-one是一種很不錯的解決辦法。

             如果一個主表會對多個子表都進行one-to-one關聯呢,就像我們一開始遇到的這種情況,比如你不僅僅只想了解那個你中意的女孩的身材和臉蛋,而且還想知道他的學歷,身世等等一切,在這種情況下,如果我們都是用多個one-to-one在主表中的話,那情況正如我們一開始看見的,是十分可怕的,該怎么做呢?不妨考慮一下使用one-to-many,什么,many?一開始聽到many這個詞的時候,我也覺得挺驚訝的這明明是多個一對一的關聯為什么要用到many呢?其實many并沒有一定要說是大于一的,你就只在它的many中存在一個關聯它有能乃你何呢?如果用到many的話,我們就需要改動數據表的設計了,在每個有關連的子表中加入一列main_id代表主表中該記錄的主鍵子段值,只需要這樣子改動就可以了,這樣所帶來的效果絕對是值得你這樣做的,然后我們就按照以往的one-to-many來設計就好了

             在body.hbm.xml加入(一到head的關聯舉例,其他的關聯按照這樣的格式添加即可)
             <set name="head" inverse="true" lazy="true" cascade="all-delete-orphan">
                <key column="ID0000"/>
                <one-to-many class="com.xx.Head"/>
              </set>

             在head.hbm.xml加入
             <many-to-one name="body" column="ID0000" class="com.xx.Body" not-null="true"/>

             行了,經過上面的改動我們就擺脫了查詢時多個outer-join的困擾,只在需要的時候才對子表進行查詢,因為設置了lazy="true",所以一切的一切都在我們的預料之中,我們如果希望獲得body的話hibernate絕對不會把它的head 也查詢出來,節省了查詢是所需要的負擔,除非到了我們十分需要head的情況才會進行關聯查詢,獲得所需要的head結果。

             所以由此看來在one-to-one這種一對一的關系不是很強的情況下,或者是在一張表中存在多個one-to-one的情況下,使用one-to-many來代替one-to-one不失為一種不錯的做法,當然更重要的良好的數據庫設計,hibernate畢竟只是末,千萬不要本末倒置
          

    posted on 2005-03-30 13:26 Find it, try it, experience it 閱讀(10388) 評論(8)  編輯  收藏

    評論

    # re: one-to-one的效率問題,用one-to-many來替代? 2005-06-30 14:28 dean

    You can also use join to avoid modifying the existing database schema (but will add an associating table):

    <class name="Person">
    <id name="id" column="personId">
    <generator class="native"/>
    </id>
    <join table="PersonAddress" optional="true">
    <key column="personId" unique="true"/>
    <many-to-one name="address" column="addressId"
    not-null="true"/>
    </join>
    </class>
    <class name="Address">
    <id name="id" column="addressId">
    <generator class="native"/>
    </id>
    </class>

    create table Person ( personId bigint not null primary key )
    create table PersonAddress ( personId bigint not null primary key, addressId bigint not null )
    create table Address ( addressId bigint not null primary key )  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代? 2005-07-02 22:05 ramon

    if there is sth u want to say, speak it in Chinese next time please  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代? 2005-08-30 21:57 Roberto Sweater

    一個月前Gavin King 在hibernate3.1 beta2 中進行了修改
    Created: 23/Jul/05 06:24 PM Updated: 30/Jul/05 12:11 AM

    http://opensource2.atlassian.com/projects/hibernate/browse/HHH-786?page=all

    sswt163@gmail.com
      回復  更多評論   

    # one-to-one的效率問題,用one-to-many來替代? (轉自http://www.tkk7.com/ramon/)[TrackBack] 2005-11-01 12:10 insiderys

    如同作者,剛好想用一個one-to-one來實現自己的持久化類,查了查,還有這樣的技巧,值得學習~~
    [引用提示]insiderys引用了該文章, 地址: http://blog.csdn.net/insiderys/archive/2005/11/01/520410.aspx  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代? 2008-01-11 09:46 kuan

    如果設置成<set>,那不是要在VO里修改原來一對一的那種映射方式為Set?  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代? 2008-01-13 20:23 Ramon

    @kuan
    老了,那是我對HIB2.2的一點理解了,現在3.X系列早已經在DEFAULT的情況下是lazy-loading了:)

    Yours,
    Ramon  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代?[未登錄] 2008-10-06 22:31 bobo

    胡扯(one-to-many跟many-to-one搭配只會更差),只用一個many-to-one就可以  回復  更多評論   

    # re: one-to-one的效率問題,用one-to-many來替代? 2008-10-07 09:30 Ramon

    樓上傻X,請看看我是對hib2.2的認識...別在這里不懂裝懂  回復  更多評論   


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


    網站導航:
     
    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    公告

    If there is any question you have, please don't hesitate, let me know ASAP, you can find me at kenees@gmail.com or QQ: 9808873, hope to make friends with you ;)

    常用鏈接

    留言簿(1)

    隨筆檔案

    文章檔案

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产好大好硬好爽免费不卡| 美女视频黄频a免费观看| a级黄色毛片免费播放视频| 亚洲成AⅤ人影院在线观看| 免费福利资源站在线视频| 国产精品无码一区二区三区免费| 中文字幕亚洲码在线| 麻豆国产VA免费精品高清在线 | 亚洲AV日韩AV永久无码色欲| 免费a级毛片高清视频不卡| 亚洲一区二区三区乱码在线欧洲| 一个人免费观看在线视频www| 亚洲av无码国产综合专区| 97无码免费人妻超级碰碰碰碰| 日韩亚洲国产综合高清| 国内一级一级毛片a免费| 欧美色欧美亚洲另类二区| 亚洲福利中文字幕在线网址| 精品无码国产污污污免费网站国产 | 日韩亚洲国产综合高清| 国产一区二区三区在线免费观看 | 丝袜熟女国偷自产中文字幕亚洲| 国产一级一毛免费黄片| 久久精品a亚洲国产v高清不卡| 99久久国产热无码精品免费| 亚洲av日韩av永久无码电影| 亚洲欧洲中文日韩久久AV乱码| 久久青草91免费观看| 亚洲一区二区三区播放在线| 日韩免费高清一级毛片在线| 亚洲国产免费综合| 久久夜色精品国产噜噜亚洲AV| 国产香蕉九九久久精品免费| 日本亚洲中午字幕乱码| 亚洲国产AV无码专区亚洲AV| 免费观看的毛片大全| 免费人成动漫在线播放r18| 亚洲午夜精品一区二区| 国产成人啪精品视频免费网| 成人免费区一区二区三区| 亚洲综合精品成人|