寫程序,做產品,過日子

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

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

          常用鏈接

          留言簿(14)

          隨筆分類(64)

          隨筆檔案(69)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          一直以為,在Hiberenate中用多對一關系表達外鍵,并設置為延遲加載時,Hibernate不會在查主表時去查引用表。今天的測試卻發現不是這么回事。

          我定義了一個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應當是這樣:select boid, company from DT_TOPIC.

          結果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進行inner join。

          2,把XPC_COMPANY中的所有字段全取出來了。

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

          ?

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

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

          Feedback

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

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

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

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

          51La
          主站蜘蛛池模板: 大埔县| 千阳县| 新蔡县| 横峰县| 石台县| 资源县| 弥勒县| 泸溪县| 汕尾市| 南阳市| 彭水| 黔西县| 左贡县| 那曲县| 北碚区| 长葛市| 焦作市| 招远市| 怀安县| 泾源县| 成武县| 阿荣旗| 仲巴县| 睢宁县| 治多县| 洛阳市| 会宁县| 鹤峰县| 温宿县| 和林格尔县| 密云县| 绩溪县| 化州市| 五家渠市| 安义县| 梁山县| 宜昌市| 汉川市| 新乡县| 德化县| 孟州市|