寫程序,做產品,過日子

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

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

          一直以為,在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 閱讀(3025) 評論(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。  回復  更多評論
            

          主站蜘蛛池模板: 集安市| 龙海市| 上饶市| 德清县| 绵阳市| 利川市| 浦北县| 靖边县| 乌恰县| 凌源市| 缙云县| 九江县| 汤原县| 长宁区| 肃宁县| 渭源县| 黄龙县| 广州市| 榕江县| 阜宁县| 襄汾县| 临高县| 新巴尔虎左旗| 龙泉市| 米脂县| 江陵县| 游戏| 遂昌县| 沅江市| 南木林县| 蒙城县| 郑州市| 离岛区| 武城县| 叶城县| 互助| 奈曼旗| 钟山县| 香港 | 太湖县| 肇源县|