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

          級聯(lián)保存和更新
          當Hibernate持久化一個臨時對象時,在默認情下,他不會自動持久化所關聯(lián)的其他臨時對象,如果希望當持久化對象時把他所關聯(lián)的所有臨時對象進行持久化的話:可以把 的cascade屬性設置為"save-update" ,cascade的默認屬性值為none。
          cascade:設置操作對象時的級聯(lián)操作,即層級之間的連鎖操作
          值 save-update :表示當保存和更新當前對象(即insert和update語句時),會級聯(lián)保存和更新與他關聯(lián)的對象
          值 all :表示任何情況下都會進行級聯(lián)操作,即對一個對象進行操作,也會對和他關聯(lián)的其他對象進行同樣的操作
          值 delete :表示在執(zhí)行delete時,進行級聯(lián)操作,刪除和他關聯(lián)的對象
          值 none :表示任何情況下,都不會進行級聯(lián)操作
          <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中,表示關聯(lián)關系中的方向關聯(lián)關系中,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的雙向關聯(lián)關系中,Customer端的關聯(lián)只是Order端關聯(lián)的鏡象(即Order端是主空端,負責維護Customer和order對象之間的關聯(lián)關系),當hibernate探測到持久化對象Customer或Order的狀態(tài)發(fā)生變化時(主要是關聯(lián)關系的改變),僅按照Order對象的狀態(tài)的變化來同步更新數(shù)據(jù)庫。
          按次配置,如果在程序中,我們僅僅使用Customer.getOrder().add(order)(涉及了和Order的關聯(lián)關系的改變),是不能讓數(shù)據(jù)庫跟對象的變化來進行數(shù)據(jù)庫同步更新的,只有利用Order對象的方法改變的Order對象狀態(tài)(eg:order.setCustomer(customer)----涉及到了和Customer的關聯(lián)關系的改變)時,數(shù)據(jù)庫才會根據(jù)變化來同步更新數(shù)據(jù)庫,即只有主控方的狀態(tài)(涉及到了和另一方面的關聯(lián)關系的改變)發(fā)生了變化后,才會觸發(fā)對象和數(shù)據(jù)庫的同步更新。

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

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

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

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

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

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

          <2008年10月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          留言簿

          隨筆檔案(1)

          文章分類(44)

          文章檔案(46)

          收藏夾(1)

          Adobe

          AOP

          API

          appServer

          BI

          c

          • c-free
          • codeblocks
          • codelite
          • CodeLite IDE 是一個強大的開源,跨平臺的 C/C++整合開發(fā)環(huán)境. 支持包括 Windows、Linux 和 Mac 系統(tǒng)下運行
          • codelite官網(wǎng)
          • dev-c++
          • Dev-C++是一個C&C++開發(fā)工具,它是一款自由軟件,遵守GPL協(xié)議。
          • 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

          供應鏈管理

          博客鏈接

          好網(wǎng)站

          工作流

          開源網(wǎng)

          招聘

          插件下載

          操作系統(tǒng)

          構建可伸縮的系統(tǒng)

          構建工具

          測試

          游戲

          源碼托管

          經(jīng)營

          資源

          金融/財務

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 盐山县| 渑池县| 额济纳旗| 古蔺县| 沅陵县| 田阳县| 南京市| 林州市| 温泉县| 武汉市| 屏东县| 巴东县| 吉木萨尔县| 皮山县| 伊春市| 弥渡县| 塔城市| 汾西县| 黑河市| 乌兰察布市| 龙海市| 武汉市| 柘荣县| 陈巴尔虎旗| 扎鲁特旗| 乌兰察布市| 临猗县| 柳林县| 伊通| 蒙山县| 大新县| 伊川县| 万州区| 洛扎县| 渭南市| 红安县| 通化县| 宜君县| 九江市| 聂拉木县| 兴业县|