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

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

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

    posts - 495,comments - 227,trackbacks - 0
    眾所周知,到了Hibernate3.0以后,關(guān)聯(lián)關(guān)系的對象默認(rèn)都是使用延遲加載,例 如<one-to-many>時.但我在映射<one-to-one>,<many-to-one>關(guān)系時指定了 lazy="true",但是在查詢對象時,我只想查詢一個對象,仍然會把這個對象所關(guān)聯(lián)的<one-to-one>,<many- to-one>對象一起查詢出來,這樣造成了極大的性能浪費.在不指定lazy屬性時,<many-to-one>所關(guān)聯(lián)的對象反而會 延遲加載,這讓我大為困惑,還以為是Hibernate的bug.
    在網(wǎng)上查找資料,說在為了延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對象,需要設(shè)置被關(guān)聯(lián)的對象<class name="" lazy="true">,我也這樣做了,但是仍然沒有效果.
    仔 細(xì)閱讀了Hibernate的手冊,才發(fā)現(xiàn)原來要延遲加載<one-to-one>,<many-to-one>所關(guān)聯(lián)的對象 時,除了要指定lazy="true"外,還需要運行期字節(jié)碼增強,而我省去了這一步,所以延遲加載沒有效果.同時還發(fā)現(xiàn)在默認(rèn)情況下,<one- to-one>,<many-to-one>的lazy屬性是"proxy"而不是"true"!因此如果直接采用lazy的默認(rèn)值, 是可以延遲加載的.
    總結(jié)一下:
    <many-to-one>默認(rèn)的屬性是lazy="proxy",此時默認(rèn)是會延遲加載的.在指定了lazy="true"之后,必須要經(jīng)過運行期字節(jié)碼增加,延遲加載才有效果.
    而<one- to-one>相對要復(fù)雜一點,延遲加載還要受到constrained屬性的限制.constrained="false"時表明實體和被關(guān)聯(lián)到 的實體的約束不是強制的,即存在一個實體時,它通過<one-to-one>關(guān)聯(lián)的實體可能存在,也可能不存在,這時在查詢實體 時,Hibernate總會發(fā)起一次查詢檢查<one-to-one>所關(guān)聯(lián)的實體是否存在,而這時已經(jīng)可以把one-to-one關(guān)聯(lián)的實 體查詢出來了,因此在<one-to-one>關(guān)系中,如果constrained="false",總是會立即加載關(guān)聯(lián)到的實體.
    如果當(dāng)constrained="true",且lazy="proxy"(默認(rèn)),是可以延遲加載的.
    如果當(dāng)constrained="true",且lazy="true"時,需要經(jīng)過運行期字節(jié)碼增加,延遲加載才會奏效.

    但是這里我還是有個疑問,既然在lazy="proxy"時,已經(jīng)實現(xiàn)了延遲加載的效果,為什么在lazy="true"時,還需要動態(tài)字節(jié)碼增強才能實現(xiàn)延遲加載呢?


    Re: Hibernate中的延遲加載


    以后在one-to-one或many-to-one中不會再有l(wèi)azy="true"了,你可以理解成no-proxy.

    [1]起碼還是好的方向: 默認(rèn)就可以lazy了. 而且來了extra :)
    [2]寫Hibernate的哥們也是要活命的嘛, 不改變怎么來的咨詢費, 不過Hibernate的migration寫的也還不錯.
    [3]constrained如你所說, 而且我估計這個屬性以后不會有太大變更.



    字節(jié)碼增強是一種基于你的配置和定義,在運行時修改代碼的技術(shù)。有一個通用的代碼創(chuàng)建庫cglib,它允許延遲加載一個實現(xiàn)類,從而避免創(chuàng)建一 個需要延遲 加載的類型。Spring,iBatais,Hibernate這些框架都使用了這種技術(shù),即所謂的動態(tài)代理。動態(tài)代理有兩種方式:
    1)如果需要代理的類實現(xiàn)了一個接口,那么這些框架就在運行時使用reflect反射機制來創(chuàng)建一個實現(xiàn)了此接口的類作為代理類。
    2)如果這個類沒有實現(xiàn)任何接口,那么就會使用cglib庫提供的方法來動態(tài)創(chuàng)建一個此類的子類作為代理類。其實也是使用了反射機制。cglib就是處理第二種情況的一個通用框架。


    方法是:在主控方的<one-to-one>上加constrained=true,在被控方的class上加lazy=true,其實這個方法是可以的

    我們都知道,一對一有兩種實現(xiàn)方式,主鍵關(guān)聯(lián)和外鍵關(guān)聯(lián)

    主鍵關(guān)聯(lián):就是說兩個表的主鍵是一樣的
                        product(id,name)   image(id,name)
                        其中image的id引用product的id,product是主,image是次
    外鍵關(guān)聯(lián):就是說是通過一個字段引用另一個表的主鍵
                        product(id,name)   image(id,name,productid)
                        其中image的productid引用product的id,product是主,image是次

     

    在主鍵關(guān)聯(lián)時,按如下進(jìn)行實體映射,是可以實現(xiàn)延遲加載的

    <hibernate-mapping package="onetoonebypk"> 
      
    <class name="Product1" table="product1"> 
        
    <id name="id" unsaved-value="null">
          
    <column name="id"></column>
          
    <generator class="uuid.hex"></generator>
        
    </id>
        
    <property name="name" column="name"></property>
         
    <one-to-one name="image1"
                    
    class="Image1"
                    cascade
    ="all"
                    constrained
    ="true"
                   
    >
        
    </one-to-one>

      
    </class> 

    </hibernate-mapping>

     

    <hibernate-mapping package="onetoonebypk"  > 
      
    <class name="Image1" table="image1" lazy="true"> 
        
    <id name="id">
          
    <generator class="foreign">
            
    <param name="property">product1</param>
          
    </generator>
        
    </id>
        
    <property name="name" column="name"></property>
         
    <one-to-one name="product1"
                     class
    ="Product1"
                     cascade
    ="all">
        
    </one-to-one>
         
      
    </class> 

    </hibernate-mapping>

    當(dāng)使用外鍵關(guān)聯(lián)是,如果按如下方式編寫映射文件,使不能進(jìn)行延遲加載的

    <hibernate-mapping package="onetoonebyfk"  > 
      
    <class name="Image" table="image" lazy="true"> 
        
    <id name="id">
          
    <generator class="uuid.hex"/>
        
    </id>
        
    <property name="name" column="name"></property>
         
    <many-to-one name="product"
                     class
    ="Product"
                     unique
    ="true"
     
                     column
    ="productid">             
         
    </many-to-one>
      
    </class> 

    </hibernate-mapping>

    <hibernate-mapping package="onetoonebyfk"> 
      
    <class name="Product" table="product"> 
        
    <id name="id" unsaved-value="null">
          
    <column name="id"></column>
          
    <generator class="uuid.hex"></generator>
        
    </id>
        
    <property name="name" column="name"></property>
        
    <one-to-one name="image"
                    class
    ="Image"
                    cascade
    ="all"
                    constrained
    ="true"
                   property-ref
    ="product"
                    
    >
        
    </one-to-one>
      
    </class> 

    </hibernate-mapping>

    為什么呢,我認(rèn)為是在主方product中,有這樣一句話property-ref="product"

    這句話的意思是說加外鍵關(guān)聯(lián)類的屬性,如果不指定這個屬性,關(guān)聯(lián)類的主鍵就會被使用

    也就是說,如果不制定這個,在查找image時就會使用
    select * from image where imageid==product_id 而不是
    select * from image where productid==product_id

    我們在知道product_id的時候,需要找image中productid等于product_id記錄,而不是用image的主鍵作為比較

    去掉propery-def后,倒是可以延遲加載,但在讀取product.getImage()方法時會報沒有指定id記錄的異常,不過這也正常,我們怎么能用image的主鍵和product_id建立查詢條件呢

    至于為什么這樣,我不是很清楚

    總之:我目前的結(jié)論是:用主鍵關(guān)聯(lián),可以延遲加載,用外鍵關(guān)聯(lián),暫時不考慮延遲加載

    至于為什么,希望能到大家的幫助

    posted on 2011-11-09 22:05 SIMONE 閱讀(11167) 評論(6)  編輯  收藏 所屬分類: JAVA

    FeedBack:
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2011-11-10 14:26 | ii
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2011-11-10 14:26 | ii
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2011-11-10 14:27 | ii
    iiooiiooioioi@ii
      回復(fù)  更多評論
      
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2011-11-10 14:37 | tbw淘寶
    總結(jié)的不氏  回復(fù)  更多評論
      
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2015-09-30 14:00 | 一個陌生人
    很6啊  回復(fù)  更多評論
      
    # re: 關(guān)于Hibernate一對一不能延遲加載的總結(jié)
    2016-03-17 17:30 |
    <many-to-one name="person" class="Person" column="personid"
    property-ref="personId" cascade="all" unique="true" />

    上面的配置必定不能進(jìn)行延遲加載?  回復(fù)  更多評論
      
    主站蜘蛛池模板: 免费观看一级毛片| 国产精品综合专区中文字幕免费播放| 亚洲精品视频免费看| 国产AV无码专区亚洲AVJULIA | 久久ww精品w免费人成| 老司机69精品成免费视频| 好紧我太爽了视频免费国产| 日本在线免费播放| 91视频免费网址| 美女视频黄免费亚洲| 最新中文字幕电影免费观看| 免费黄色网址入口| 免费在线一级毛片| 亚洲中文字幕在线乱码| 亚洲av永久无码精品网站| 亚洲精品私拍国产福利在线| 亚洲国产中文在线二区三区免| 亚洲国产综合精品中文第一| 亚洲av无码专区在线观看下载| 美国免费高清一级毛片| 国产区在线免费观看| 久久青青草原国产精品免费| 国产妇乱子伦视频免费| 成人人观看的免费毛片| 免费a级黄色毛片| 亚洲精品二区国产综合野狼| 亚洲精品中文字幕乱码| 亚洲午夜无码久久久久小说| 男女猛烈无遮掩视频免费软件| 99久久精品毛片免费播放| h视频在线观看免费网站| 女人18毛片特级一级免费视频| 亚洲&#228;v永久无码精品天堂久久| 亚洲欧洲国产成人综合在线观看| 亚洲成AV人片在| 久久亚洲最大成人网4438| 特a级免费高清黄色片| 久久久久久AV无码免费网站| 成人免费a级毛片无码网站入口| 亚洲精品无码久久久| 亚洲精彩视频在线观看|