<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      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 閱讀(1159) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 深夜特黄a级毛片免费播放| 亚洲伊人久久大香线蕉AV| 国产精品免费在线播放| 亚洲偷自拍拍综合网| 无码毛片一区二区三区视频免费播放| 暖暖免费高清日本中文| 亚洲国产精品嫩草影院| 国产精品美女自在线观看免费 | 亚洲AV成人一区二区三区AV| 青柠影视在线观看免费高清| 亚洲AV无码国产精品色午友在线 | 国产免费不卡视频| 亚洲国产午夜精品理论片| 国产精品色拉拉免费看| 亚洲日本VA中文字幕久久道具| 日本免费人成黄页在线观看视频| 成a人片亚洲日本久久| 亚洲乱亚洲乱少妇无码| 中文字幕日本人妻久久久免费| 午夜亚洲AV日韩AV无码大全| 国产免费丝袜调教视频| 亚洲色大成网站www尤物| 亚洲无码高清在线观看| 免费国产午夜高清在线视频| 亚洲免费观看在线视频| 日本一线a视频免费观看| 久久久WWW免费人成精品| 亚洲国产精品久久网午夜 | 亚洲色欲久久久久综合网| 国产一级一毛免费黄片| 亚洲成年人电影在线观看| 在线观看91精品国产不卡免费| 丰满少妇作爱视频免费观看| 亚洲精品高清视频| 日本免费一区二区三区最新vr| 一区二区三区在线免费观看视频| 亚洲国产精品久久久久婷婷软件| 午夜无遮挡羞羞漫画免费| 成年女人A毛片免费视频| 亚洲午夜国产精品| 亚洲中文字幕成人在线|