posts - 0,  comments - 17,  trackbacks - 0
          來源:http://www.tianxiaboke.com/u/lyeerwy

          級聯保存和更新
          當Hibernate持久化一個臨時對象時,在默認情下,他不會自動持久化所關聯的其他臨時對象,如果希望當持久化對象時把他所關聯的所有臨時對象進行持久化的話:可以把 的cascade屬性設置為"save-update" ,cascade的默認屬性值為none。
          cascade:設置操作對象時的級聯操作,即層級之間的連鎖操作
          值 save-update :表示當保存和更新當前對象(即insert和update語句時),會級聯保存和更新與他關聯的對象
          值 all :表示任何情況下都會進行級聯操作,即對一個對象進行操作,也會對和他關聯的其他對象進行同樣的操作
          值 delete :表示在執行delete時,進行級聯操作,刪除和他關聯的對象
          值 none :表示任何情況下,都不會進行級聯操作
          <set>元素的inverse屬性

          在運行上面的程序時,如果hibernate的"show-sql"設置為true時,就會看到Hibernate會生成很多sql語句,其實很多sql語句都是重復的
          eg: 
          insert into  test.order(o_name,c_id)values(?,?)
          insert into  test.order(o_name,c_id)values(?,?)
          insert into  test order   set c_id=? where id=?
          insert into  test order   set c_id=? where id=?

          為了解決這個問題,我們可以利用在<set>標簽中加上inverse屬性。術語:inverse是指反轉的意思,在Hibernate中,表示關聯關系中的方向關聯關系中,inverse="false"的主控方,由主動方負責維護對象關系我們 在customer對象的對象配置文件中加上

          <set name="orders"  cascade="save-update" inverse="true">
          <key  column="c_id" > </key>
          <one-to-many class="net.mbs.mypack.Order " />
          </set>

          聲明在Customer和Order的雙向關聯關系中,Customer端的關聯只是Order端關聯的鏡象(即Order端是主空端,負責維護Customer和order對象之間的關聯關系),當hibernate探測到持久化對象Customer或Order的狀態發生變化時(主要是關聯關系的改變),僅按照Order對象的狀態的變化來同步更新數據庫。
          按次配置,如果在程序中,我們僅僅使用Customer.getOrder().add(order)(涉及了和Order的關聯關系的改變),是不能讓數據庫跟對象的變化來進行數據庫同步更新的,只有利用Order對象的方法改變的Order對象狀態(eg:order.setCustomer(customer)----涉及到了和Customer的關聯關系的改變)時,數據庫才會根據變化來同步更新數據庫,即只有主控方的狀態(涉及到了和另一方面的關聯關系的改變)發生了變化后,才會觸發對象和數據庫的同步更新。

          映射一對多雙向關聯關系
          當類與類之間建立了關聯,就可以方便的從一個對象導航到另一個對象或一組與他關聯的對象當中,根據上面的程序,對于一個給定的Order對象,如果想獲取與他關聯的Customer對象,我們只需要調用入下方法:
          Customer c=order.geCustomer(); 那么當我們得到一個Customer對象后,想查出和這個Customer對象關聯的所有Order對象時,應該怎么辦呢?由于在Customer中沒有建立對Order對象的關聯,所以,不能通過加載Customer對象來自動加載和他關聯的所有Order對象,唯一的方法只能通過JDBC或SQL語言人工寫出代碼來查詢數據庫Order表來返回所需要的信息
          上面的問題雖然解決,但不能算是最好,因為這樣性能會有所下降,對象位于內存中,在內存中從一個對象導航到另一個對象顯然比到數據庫中查詢數據要快得多

          具體實現<br>
          1:由于Customer和Order是一對多,即一個Customer要對應多個Order,所以在Customer中應該建立一個Set對象,用于存放和本Customer對象關聯的所有Order對象。
          2:在customer.hbm.xml通過<one-to-many>建立對Order表的關聯關系
          注意:<one-to-many>應該放置在<set>標簽中 
          我們先來看看Customer類的設計和customer.hbm.xml文件的內容
          <br><br><br>------------------------------------------------------
          Customer Order 雙向一對多
          1:Customer類中建立一個容器對象,包含關聯的所有Order對象
          2:Order類中建立一個Customer對象,關聯Customer
          inverse="true"表示將維護關聯的權利交給引起Hibernate語句的生成

          customer.getOrders().add(order);
          customer.setName("dddddd");

          inverse="true"(設置此屬性的一方----是被控方)
          當主控方修改對象之間的關聯關系時,讓Hibernate生成sql語句

          posted on 2008-03-15 23:56 xyz 閱讀(8768) 評論(2)  編輯  收藏 所屬分類: 網絡文摘

          FeedBack:
          # re: Hibernate級聯保存和更新
          2008-03-15 23:57 | xyz
          但是為什么級聯插入數據庫后,沒有把外鍵也插入呢??  回復  更多評論
            
          # re: Hibernate級聯保存和更新[未登錄]
          2008-10-15 13:21 | x
          不咋地  回復  更多評論
            

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿

          隨筆檔案(1)

          文章分類(44)

          文章檔案(46)

          收藏夾(1)

          Adobe

          AOP

          API

          appServer

          BI

          c

          • c-free
          • codeblocks
          • codelite
          • CodeLite IDE 是一個強大的開源,跨平臺的 C/C++整合開發環境. 支持包括 Windows、Linux 和 Mac 系統下運行
          • codelite官網
          • dev-c++
          • Dev-C++是一個C&C++開發工具,它是一款自由軟件,遵守GPL協議。
          • GCC
          • GCC 原名為 GNU C 語言編譯器(GNU C Compiler),因為它原本只能處理 C語言。GCC 很快地擴展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語言。

          Cache

          CMS

          DB

          eclipse

          FreeMarker

          hibernate

          html5

          ibatis

          java

          jquery

          js

          json

          Linux

          Log

          mail server

          mobile

          mysql

          oauth

          openID

          other

          PHP

          portal

          report

          Scheduler

          schema

          Security

          SOA

          spring

          struts

          UI原型設計

          w3c

          Wap

          webservice

          xml

          供應鏈管理

          博客鏈接

          好網站

          工作流

          開源網

          招聘

          插件下載

          操作系統

          構建可伸縮的系統

          構建工具

          測試

          • IETest
          • IE官網
          • OpenSTA
          • Siege
          • Siege是一個壓力測試和評測工具,設計用于WEB開發這評估應用在壓力下的承受能力

          游戲

          源碼托管

          經營

          資源

          金融/財務

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 民和| 石泉县| 剑川县| 沭阳县| 二连浩特市| 瓮安县| 南郑县| 莲花县| 辽阳县| 宣城市| 郧西县| 图木舒克市| 灌南县| 丹江口市| 阿合奇县| 新巴尔虎左旗| 焦作市| 紫金县| 太康县| 台江县| 兴山县| 大同市| 抚顺县| 贵南县| 荔浦县| 烟台市| 阿克陶县| 华容县| 临西县| 马龙县| 铁力市| 道孚县| 长汀县| 北海市| 昭通市| 富蕴县| 河津市| 宁海县| 漯河市| 疏附县| 潞城市|