hibernate多生成一個外鍵以及映射文件中含有標籤

 

(原文地址: http://blog.csdn.net/xiaoxian8023/article/details/15380529)

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

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

      (實例1):html

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

 

[java]  view plain  copy
 
  1. Parent p = new Parent();  
  2. Child c = new Child();  
  3. c.setParent(p);  //維護父子之間關係  
  4. p.getChildren().add(c);  
  5.   
  6. session.save(p);  
  7. session.flush();  

       映射文件配置:web

[html]  view plain  copy
 
  1. 父親中的關係映射  
  2. {set name="children" lazy="true" inverse="true"}  
  3.       {key column="parent_id"/}  
  4.       {one-to-many class="test.Child"/}  
  5. {/set}  
  6.   
  7. 兒子中關係映射  
  8. {many-to-one name="parent" column="parent_id" not-null="true"/}  

       set中inverse="true",說明父子關係只在多的一端(Child)維護。因此只會發出2個insert語句。sql

       注意:{many-to-one}老是設成「inverse=false」的,並且這個屬性在Mapping中是不存在的!數據庫

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

[sql]  view plain  copy
 
  1. Hibernate: insert into parent (id) values (?)  
  2. Hibernate: insert into child (parent_id, id) values (?, ?)  

       若是將set中的inverse設爲true,那麼會發出3條sql語句,前2條是insert語句,後1條是update語句用來維護parent和child類的父子關係。oracle

       固然,假如c.setParent(p)註釋掉(破壞了父子關係),結果就變成了:app

[sql]  view plain  copy
 
  1. Hibernate: insert into parent (id) values (?)  

 

===================================================
     (實例2):
       一個Person能夠參加多個Event,一個Event有多個Person參加。映射文件以下:post

 

[html]  view plain  copy
 
  1. <!-- Person.hbm.xml -->  
  2. <hibernate-mapping package="events">  
  3.   <class name="Person" table="person">  
  4.       <id name="id" column="person_id">  
  5.           <generator class="native"/>  
  6.       </id>  
  7.       <property name="age" length="0"/>  
  8.       <property name="firstname"/>  
  9.       <property name="lastname"/>  
  10.       <set name="events" table="person_event">  
  11.           <key column="person_id"/>  
  12.           <many-to-many column="event_id" class="events.Event"/>  
  13.       </set>  
  14.   </class>  
  15. </hibernate-mapping>  
  16.   
  17. <!-- Event.hbm.xml -->  
  18. <hibernate-mapping>  
  19.   <class name="events.Event" table="events">  
  20.       <id name="id" column="event_id">  
  21.             <generator class="native"/>  
  22.       </id>  
  23.       <property name="date" column="events_date" type="timestamp"/>  
  24.       <property name="title" column="events_title"/>  
  25.       <set name="participants" table="person_event" inverse="true">  
  26.           <key column="event_id"/>  
  27.           <many-to-many column="person_id" class="events.Person"/>  
  28.       </set>  
  29.   </class>  
  30. </hibernate-mapping>  


       inverse=true的含義: 由雙向關聯另外一方維護該關聯,己方不維護該關聯(只能進行查詢操做)。在上述代碼中,由Person方維護該<many-to-many>關係,示例代碼以下(以向Person參與的Event中加入新的Event爲例):
       fetch

[java]  view plain  copy
 
  1. Session session = HibernateUtil.getSessionFactory().getCurrentSession();  
  2.        session.beginTransaction();  
  3.        Person p = (Person) session.load(Person.class, personId);  
  4.        Event e = (Event) session.load(Event.class, eventId);  
  5.        p.getEvents().add(e);//執行該代碼時,hibernate會向中間表 person_event中插入person_id和event_id記錄,若是換成e.getParticipants().add(p)的話,該代碼將不會被執行,即hibernate不會向表person_event中插入記錄。  
  6.        session.getTransaction().commit();  


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

       2、Inverse和Cascade的比較

       Inverse:負責控制關係,默認爲false,也就是關係的兩端都能控制,但這樣會形成一些問題,更新的時候會由於兩端都控制關係,因而重複更新。通常來講有一端要設爲true。

 

       Cascade:負責控制關聯對象的級聯操做,包括更新、刪除等,也就是說對一個對象進行更新、刪除時,其它對象也受影響,好比我刪除一個對象,那麼跟它是多對一關係的對象也所有被刪除。
舉例說明區別:刪除「一」那一端一個對象O的時候,若是「多」的那一端的Inverse設爲true,則把「多」的那一端全部與O相關聯的對象外鍵清空;若是「多」的那一端的Cascade設爲Delete,則把「多」的那一端全部與O相關聯的對象所有刪除。

 

 

對hibernate List一對多中list-index的理解(原文地址: http://blog.csdn.net/u014437455/article/details/22516865)

原創 2014年03月29日 21:52:08

對於hibernate中List集合一對多;一直存在迷惑;每次用的時候老是要查閱許多資料;索性本身就總結啦一下;

eg:

  品牌表:

              <many-to-one name="subType" class="com.oracle.webdp.entity.SubType" fetch="join">
            <column name="SUBTYPE_ID"/>
        </many-to-one>

   小類表:

<list name="brands" inverse="false" table="BRAND" lazy="true">
            <key>
                <column name="SUBTYPE_ID" />
            </key>
            <list-index>
                  <column name="`index`"></column>
            </list-index>
            <one-to-many class="com.oracle.webdp.entity.Brand" />
        </list>

  (1):關於key的配置

                  之前老是對於key裏面的column中name屬性感到迷惑;首先要明白這個字段是位於品牌表(多的一方);是他的一個屬性(字段);名字能夠隨便取;只要保證兩邊設置的值是同樣的;便可;能夠查看生成對應的表信息

 

這樣的話就明白了key的真正用途;      

                

  (2):關於list-index的配置-----------在保存行數據進表裏時,hiberante會幫你維護順序

     相信你們對於set集合的配置已經很熟悉啦;它有兩個特色:不能重複且是無序的;相反list集合倒是有序且容許重複的;

    這麼就引出一個問題;數據庫如何保證數據的有序性哪?

     思路:設置一個索引字段;用以保存順序;

相關文章
相關標籤/搜索