寫程序,做產(chǎn)品,過(guò)日子

          成功其實(shí)很簡(jiǎn)單,就是強(qiáng)迫自己堅(jiān)持下去

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            69 Posts :: 1 Stories :: 92 Comments :: 0 Trackbacks

          一直以為,在Hiberenate中用多對(duì)一關(guān)系表達(dá)外鍵,并設(shè)置為延遲加載時(shí),Hibernate不會(huì)在查主表時(shí)去查引用表。今天的測(cè)試卻發(fā)現(xiàn)不是這么回事。

          我定義了一個(gè)Topic類,其中有一個(gè)外鍵引用Company類:

          ?

          < many-to-one? name ="company" ?class ="Company" ?lazy ="no-proxy" >
          < column? name ="COMPANY" ?length ="32" ? />
          </ many-to-one >

          ?

          測(cè)試HQL如下:select id, company from Topic

          而我期望的SQL應(yīng)當(dāng)是這樣:select boid, company from DT_TOPIC.

          結(jié)果Hiberate Tools 生成的SQL是這樣:

          ?

          select
          topic0_.BOID?
          as ?col_0_0_,
          topic0_.COMPANY?
          as ?col_1_0_,
          company1_.COMPID?
          as ?COMPID409_,
          company1_.COMPNAME?
          as ?COMPNAME409_,
          company1_.DESCRIPTION?
          as ?DESCRIPT3_409_,
          company1_.STATUS?
          as ?STATUS409_?
          from
          DT_TOPIC?topic0_?
          inner ? join
          XPC_COMPANY?company1_?
          on ?topic0_.COMPANY = company1_.COMPID

          ?

          Hibernate生成的SQL多做了兩件影響性能的事情:

          1, 與XPC_COMPANY進(jìn)行inner join。

          2,把XPC_COMPANY中的所有字段全取出來(lái)了。

          這樣還叫什么延遲加載啊?

          ?

          哪位高手能告訴我這是為什么?

          posted on 2007-01-17 21:54 Welkin Hu 閱讀(3028) 評(píng)論(4)  編輯  收藏 所屬分類: Java

          Feedback

          # re: Hibernate的多對(duì)一關(guān)系是如何延遲加載的? 2007-01-18 09:59 小雪飛刀
          當(dāng)然不會(huì)延遲了!
          您的lazy ="no-proxy"
          <many-to-one>默認(rèn)的屬性是lazy="proxy",此時(shí)默認(rèn)是會(huì)延遲加載的。而在指定了lazy="true"之后,必須要經(jīng)過(guò)運(yùn)行期字節(jié)碼增加,延遲加載才有效果。  回復(fù)  更多評(píng)論
            

          # re: Hibernate的多對(duì)一關(guān)系是如何延遲加載的? 2007-01-18 10:06 小雪飛刀
          而對(duì)于<one-to-one>的情況,延遲加載還要受到constrained屬性的影響。如果當(dāng)constrained="true",lazy="proxy"(默認(rèn)),是可以延遲加載的。因?yàn)閏onstrained="false"時(shí)表明實(shí)體和被關(guān)聯(lián)到的實(shí)體的約束不是強(qiáng)制的,這時(shí)在查詢實(shí)體時(shí),Hibernate總會(huì)檢查<one-to-one>所關(guān)聯(lián)的實(shí)體是否存在,就把one-to-one關(guān)聯(lián)的實(shí)體查詢出來(lái)了,所以constrained需要設(shè)為"true"。
            回復(fù)  更多評(píng)論
            

          # re: Hibernate的多對(duì)一關(guān)系是如何延遲加載的? 2007-01-18 10:35 Welkin Hu
          我用的是Hibernate 3.2.1,在Many-to-one中的Lazy只能取proxy, no-proxy, false,沒(méi)有true。
          上面三種Lazy方法我都試過(guò),結(jié)果是一樣的。
          在Hibernate3.2.1參考文檔中是這樣解釋的。
          lazy (optional - defaults to proxy): By default, single point associations are proxied. lazy="no-proxy"
          specifies that the property should be fetched lazily when the instance variable is first accessed (requires
          build-time bytecode instrumentation). lazy="false" specifies that the association will always be eagerly
          fetched.
          按這個(gè)解釋,no-proxy也是延遲加載啊。  回復(fù)  更多評(píng)論
            

          # re: Hibernate的多對(duì)一關(guān)系是如何延遲加載的? 2007-01-22 09:19 Welkin Hu
          前天按Hibernate 3.2.1 reference book,玩通了上面說(shuō)的build-time bytecode instrumentation,并且設(shè)置lazy="proxy",引用表端也設(shè)置了lazy="true",最終生成的SQL還是老樣子!
          只有兩種情況在例外,無(wú)論做不做instrumentation:
          1,只有from,沒(méi)有select子句。
          2, 使用select company.id代替select company。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 江永县| 古田县| 吴旗县| 缙云县| 阜阳市| 阳信县| 游戏| 淳化县| 颍上县| 富顺县| 白水县| 友谊县| 金山区| 泗洪县| 汪清县| 五台县| 斗六市| 建阳市| 黑龙江省| 黄大仙区| 鹤峰县| 丰县| 酉阳| 清镇市| 灵璧县| 肇州县| 蓬溪县| 定陶县| 于田县| 莱州市| 西城区| 清远市| 论坛| 正镶白旗| 芦山县| 开阳县| 广汉市| 台东县| 宜兰县| 锦屏县| 元阳县|