Hibernate一對多(雙向)

來源:互聯網
上載者:User
///Hibernate:///雙向關聯就是有“一對多”和“多對一”兩個關聯組合而成德,在雙向關聯的兩端都知道對方是誰。下面就開始示範這種關聯。首先定義我們需要使用的POJO對象。public class Member{    private String id;     private String name;     private Integer age;     private Set<Order> orders = new HashSet<Order>();//我知道Order對象    ……}public class Order{    private Integer id;     private String name;     private String num;     private Member member;//我知道Member對象……}兩個POJO對應的對應檔分別為Member.hbm.xml和Order.hbm.xml。Member.hbm.xml<hibernate-mapping package="org.louis.domain">     <class name="Member" table="TEST_MEMBER">        <id name="id" column="ID">             <generator class="uuid.hex"></generator>         </id>         <property name="age" column="AGE"></property>         <property name="name" column="NAME"></property>         <set name="orders" cascade="all" inverse="true"><!--設定inverse=”true”表示Member不在作為主控方,就是說不再由Member來維持關聯關係,而有Order方來維持關聯關係,這樣Order在持久化的時候會主動去擷取Member的主索引值來作為自己的外索引值。 在one-to-manay關聯關係中,一般將manay端設定為主控方(inverse=”false”),這樣將有助於改善效能。預設情況下inverse=”false” -->             <key column="MEMBER_ID"></key>             <one-to-many class="Order"/>         </set></class> </hibernate-mapping>Order.hbm.xml<hibernate-mapping package="org.louis.domain">     <class name="Order" table="TEST_ORDER">         <id name="id" column="ID">             <generator class="native"></generator>         </id>         <property name="name" column="NAME"></property>         <property name="num" column="NUM"></property>         <many-to-one name="member" class="Member" column="MEMBER_ID"></many-to-one></hibernate-mapping>下面我們來進行測試。a、插入資料public void insert(){         Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();         session.beginTransaction();         Member m = new Member();         m.setAge(24);         m.setName("Louis");        Order order = new Order();        order.setName("order 1");        order.setNum("order num 1");        order.setMember(m);        m.getOrders().add(order);        session.save(m);         session.getTransaction().commit();     }查看Hibernate在後台使用的SQL語句如下:Hibernate:     insert     into         TEST_MEMBER         (AGE, NAME, ID)     values         (?, ?, ?) Hibernate:     insert     into         TEST_ORDER         (NAME, NUM, MEMBER_ID)     values         (?, ?, ?)僅僅就兩條語句,明顯比單向關聯的時候少了一條更新語句(把Order的外鍵進行更新為Menber的主索引值)。b、載入資料和單向關聯的區別在於,如果載入的是Order對象,那麼它也知道和它關聯的對象。c、刪除資料刪除資料和單向關聯時的刪除資料的區別在於,對Member及它的關聯對象Order載入後,不需要在更新Order的外鍵為NULL,而是緊跟著逐條刪除Order,最後刪除Member。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.