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

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

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

    一杯清茶

    統計

    留言簿

    Oracle SQL/PLSQL

    PowerDesigner教程系列

    Struts2.0

    web開發

    三人行

    從事RCP開發的同行

    工作流和權限設置

    閱讀排行榜

    評論排行榜

    hibernate中inverse的用法

    轉自:http://blog.csdn.net/leader_lx/archive/2008/08/06/2774137.aspx

    一、Inverse是hibernate雙向關系中的基本概念。inverse的真正作用就是指定由哪一方來維護之間的關聯關系。當一方中指定了“inverse=false”(默認),那么那一方就有責任負責之間的關聯關系,說白了就是hibernate如何生成Sql來維護關聯的記錄! 

     

            Hibernate僅僅按照主控方對象的狀態的變化來同步更新數據庫。按照原來的映射文件,people.getAddresses().add(address),即主控方對象的狀態發生了改變,因此數據庫會跟著對象狀態的變化來同步更新數據庫;而address.setPeople(people),即被控方對象的狀態發生了改變,它是不能觸發對象和數據庫的同步更新的。

     

    (實例1):

    舉個最簡單的一對多父子關系。那么代碼就寫成:

    父親中的關系映射

    {set name="children" lazy="true" inverse="true"}
          
    {key column="parent_id"/}
          
    {one-to-many class="test.Child"/}
    {/set}

     

    兒子中關系映射

    {many-to-one name="parent" column="parent_id" not-null="true"/}

     


     

    Parent p = new Parent();
    Child c 
    = new Child();
    c.setParent(p);  
    //維護父子之間關系
    p.getChildren().add(c);

    session.save(p);
    session.flush();

     

    注意:{many-to-one}總是設成“inverse=false”的,而且這個屬性在Mapping中是不存在的!

    這樣運行的下來的結果就是:

    Hibernate: insert into parent (id) values (?)
    Hibernate: insert into child (parent_id, id) values (?, ?)

    那么假如c.setParent(p)注釋掉,結果就是:

    Hibernate: insert into parent (id) values (?)

     

    ===================================================

    (實例2):

    一個Person可以參加多個Event,一個Event有多個Person參加。
    映射文件如下:

    <!-- Person.hbm.xml -->
    <
    hibernate-mapping package="events">
      
    <class name="Person" table="person">
          
    <id name="id" column="person_id">
              
    <generator class="native"/>
          
    </id>
          
    <property name="age" length="0"/>
          
    <property name="firstname"/>
          
    <property name="lastname"/>
          
    <set name="events" table="person_event">
              
    <key column="person_id"/>
              
    <many-to-many column="event_id" class="events.Event"/>
          
    </set>
      
    </class>
    </hibernate-mapping>

    <!-- Event.hbm.xml -->
    <
    hibernate-mapping>
      
    <class name="events.Event" table="events">
          
    <id name="id" column="event_id">
                
    <generator class="native"/>
          
    </id>
          
    <property name="date" column="events_date" type="timestamp"/>
          
    <property name="title" column="events_title"/>
          
    <set name="participants" table="person_event" inverse="true">
              
    <key column="event_id"/>
              
    <many-to-many column="person_id" class="events.Person"/>
          
    </set>
      
    </class>
    </hibernate-mapping>

    inverse=true的含義: 由雙向關聯另一方維護該關聯,己方不維護該關聯(只能進行查詢操作)。在上述代碼中,由Person方維護該<many-to-many>關系,示例代碼如下(以向Person參與的Event中加入新的Event為例):
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            Person p 
    = (Person) session.load(Person.class, personId);
            Event e 
    = (Event) session.load(Event.class, eventId);
            p.getEvents().add(e);//執行該代碼時,hibernate會向中間表 person_event中插入person_id和event_id記錄,如果換成e.getParticipants().add(p)的話,該代碼將不會被執行,即hibernate不會向表person_event中插入記錄。
            session.getTransaction().commit();


    要注意的一點:在雙向關聯的關系中,映射的column(和table)的值要一致(即要用相同的表名和列名),不然設置為inverse="true"的這方將失去這個雙向關系,而變成了一個單向關聯。

    二、Inverse和Cascade的比較

    Inverse:負責控制關系,默認為false,也就是關系的兩端都能控制,但這樣會造成一些問題,更新的時候會因為兩端都控制關系,于是重復更新。一般來說有一端要設為true。
    Cascade:負責控制關聯對象的級聯操作,包括更新、刪除等,也就是說對一個對象進行更新、刪除時,其它對象也受影響,比如我刪除一個對象,那么跟它是多對一關系的對象也全部被刪除。
    舉例說明區別:刪除“一”那一端一個對象O的時候,如果“多”的那一端的Inverse設為true,則把“多”的那一端所有與O相關聯的對象外鍵清空;如果“多”的那一端的Cascade設為Delete,則把“多”的那一端所有與O相關聯的對象全部刪除。

    posted on 2009-12-18 15:17 一杯清茶 閱讀(284) 評論(0)  編輯  收藏 所屬分類: Hibernate

    主站蜘蛛池模板: 久久久久无码专区亚洲av| 亚洲成人一区二区| 亚洲国产精品久久网午夜| 在线看片免费人成视频久网下载| 一本色道久久88综合亚洲精品高清| 亚洲国产av玩弄放荡人妇| 四虎永久在线精品免费网址| 亚洲av专区无码观看精品天堂| 国产精品久久久久久久久免费| 亚洲国产成AV人天堂无码| 精品免费久久久久久久| 国产成人精品日本亚洲直接| 青春禁区视频在线观看直播免费| 亚洲av乱码一区二区三区| 日韩免费毛片视频| 夜夜爽妓女8888视频免费观看| 亚洲综合另类小说色区色噜噜| 在线观看免费无码视频| 亚洲精品欧洲精品| 在线不卡免费视频| 精品一区二区三区免费毛片| 亚洲精品国产福利一二区| 91视频免费网站| 亚洲欧洲精品在线| 日韩a级毛片免费视频| 五月天婷婷免费视频| 久久久久亚洲精品影视| 永久免费AV无码国产网站| 老司机福利在线免费观看| 亚洲AV综合色一区二区三区| 国产92成人精品视频免费| 久久亚洲精品无码av| 国产成人无码综合亚洲日韩| 我的小后妈韩剧在线看免费高清版 | 日本zzzzwww大片免费| 亚洲情A成黄在线观看动漫软件| 免费a级毛片大学生免费观看| 国产在线精品观看免费观看| 亚洲欧洲高清有无| 亚洲性日韩精品一区二区三区| 99视频精品全部免费观看|