少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
          來源: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 2012-03-11 16:36 abin 閱讀(1148) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 汕头市| 稻城县| 巴林右旗| 五峰| 渝北区| 江阴市| 长武县| 桂平市| 贵南县| 肇庆市| 开远市| 井陉县| 汾阳市| 永安市| 四会市| 年辖:市辖区| 庆元县| 南康市| 东山县| 沂源县| 湖南省| 万州区| 马山县| 胶州市| 弋阳县| 五台县| 彩票| 崇文区| 绥阳县| 黄浦区| 定西市| 湘阴县| 多伦县| 湛江市| 景谷| 宿松县| 珠海市| 安岳县| 元江| 收藏| 昆山市|