<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 閱讀(1150) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 老司机午夜在线视频免费观| 亚洲a∨无码精品色午夜| 久久精品免费网站网| 亚洲精品网站在线观看不卡无广告| 亚洲色最新高清av网站| 男男AV纯肉无码免费播放无码| 亚洲成A∨人片在线观看无码| 91大神免费观看| 亚洲最大视频网站| 四虎在线最新永久免费| 亚洲一区二区三区在线观看蜜桃| 69式国产真人免费视频| 色天使亚洲综合在线观看| 亚洲免费网站观看视频| 亚洲爆乳精品无码一区二区| 日本高清免费网站| 一本久久A久久免费精品不卡 | 最近最新的免费中文字幕| 中文字幕精品三区无码亚洲| 波多野结衣久久高清免费 | 黄视频在线观看免费| 国产AV无码专区亚洲AV毛网站| 99精品视频免费观看| 亚洲一级片在线播放| 四虎永久在线精品免费影视 | 亚洲无砖砖区免费| 亚洲另类无码专区首页| 免费人成视频在线观看不卡| 黄色视频在线免费观看| 亚洲午夜精品一区二区公牛电影院| 亚洲综合国产一区二区三区| 精品四虎免费观看国产高清午夜| 亚洲自偷自偷精品| 成人免费无码精品国产电影| 精品多毛少妇人妻AV免费久久 | 99热亚洲色精品国产88| 亚洲精品无码久久不卡| 美女内射无套日韩免费播放| 日本亚洲欧美色视频在线播放| 亚洲日韩激情无码一区| 国产福利在线免费|