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

          成功其實很簡單,就是強迫自己堅持下去

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

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

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

          ?

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

          ?

          測試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中的所有字段全取出來了。

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

          ?

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

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

          Feedback

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

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

          # re: Hibernate的多對一關(guān)系是如何延遲加載的? 2007-01-18 10:35 Welkin Hu
          我用的是Hibernate 3.2.1,在Many-to-one中的Lazy只能取proxy, no-proxy, false,沒有true。
          上面三種Lazy方法我都試過,結(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.
          按這個解釋,no-proxy也是延遲加載啊。  回復(fù)  更多評論
            

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

          主站蜘蛛池模板: 南溪县| 赫章县| 嘉荫县| 浙江省| 叙永县| 威宁| 通山县| 修文县| 阳新县| 甘肃省| 万盛区| 阜康市| 昔阳县| 泸西县| 积石山| 临澧县| 攀枝花市| 崇义县| 扎鲁特旗| 宁安市| 涿州市| 西昌市| 胶州市| 维西| 昭通市| 深泽县| 文昌市| 玉屏| 津市市| 汉中市| 通化县| 锡林浩特市| 鄂托克前旗| 肇庆市| 资中县| 拉孜县| 富川| 都兰县| 勃利县| 黑山县| 沽源县|