天天看點

多対一關聯映射

     多対一恐怕是現實世界中存在的最普遍的一種關聯關系了。

     hibernate在解決多対一關聯映射時提出了一種普遍的思想:在實體模型中通過“多”持有“一”的引用來反映這種關系,在關系模型中通過在“多”的一端增加個外加指向“一”的一端。其實,這種思想還常常用來解決一對一和多對多。

      看看我們的User和Group的執行個體是怎麼實作的吧:

1.實體模型:

2.關系模型:

3.實體類:

  Group.java

public class Group { 

  private int id; 

  private String name; 

  //一系列的setter.getter方法 

  @Override 

  public String toString() { 

    return "Group:"+name; 

  } 

}

   User.java

public class User { 

  private Group group; 

    return "User:"+name; 

4.映射檔案:

  Group.hbm.xml

  <class name="com.sxt.hibernate.many2one.entity.Group" table="sxt_hibernate_group"> 

    <id name="id" length="4"> 

      <generator class="native"></generator> 

    </id> 

    <property name="name" length="10"></property> 

  </class>

    User.hbm.xml

  <class name="com.sxt.hibernate.many2one.entity.User" table="sxt_hibernate_user"> 

    <!--many-to-one含義,會在多的一端加入一個外鍵指向一的一端,以供加載時使用.外鍵由column屬性指定,預設和實體屬性名相同. 

            cascade操作本對象時級聯操作它的關聯對象     --> 

    <many-to-one name="group" column="group_id" cascade="save-update"></many-to-one> 

5.hibernate配置檔案:

  參照前面的。

6.測試方法:

  public static void main(String[] args) { 

    Session session = HibernateUtils.getSession(); 

    Transaction t = session.beginTransaction(); 

    try { 

      /** 

        * 測試插入資料 

        */ 

/*         Group group = new Group();//情況1.生成一個新的組 g.setName("開發組"); 

        group.setName("研發組"); 

        User user1=new User(); 

        user1.setName("奇隆"); 

        user1.setGroup(group); 

        User user2=new User(); 

        user2.setName("有朋"); 

        user2.setGroup(group); 

        //這裡也要保證在save(user)前,它所關聯的group要先save或者在User的映射檔案中配置上cascade級聯save,. 

        session.save(user1); 

        session.save(user2);*/ 

/*        Group group=(Group)session.get(Group.class, 2);//情況2.加載資料庫中已經存在的組 

        User user=new User();     

        user.setName("謝霆鋒"); 

        user.setGroup(group); 

        //由于加載的group 已經是持久化的了,是以這樣也能儲存成功. 

        session.save(user);*/ 

        /** 

         * 小結:儲存user之前要保證它所引用對象已經是持久化的,這樣在儲存user時,hibernate會自動把user的外鍵指向group的id 

         */ 

      User user = (User) session.get(User.class, 3);// 隻是加載了user對象和它所在組的對象group的id屬性,并沒有加載group對象 

      System.out.println(user); 

      System.out.println(user.getGroup()); 

        * 小結:可見,在"多"的一端(user)可以加載"一"的一端(group).當然,這裡存在延遲加載政策,有時間專門讨論. 

      session.save(user);//由于user已經是持久化的對象,并且沒有做出修改,是以這裡并不觸發任何的sql操作    

      user.setName("鄭伊健"); 

      session.save(user);//由于user已經做了改動,是以這裡會觸發update操作. 

      t.commit(); 

    } catch (HibernateException e) { 

      e.printStackTrace(); 

      t.rollback(); 

    } finally { 

      HibernateUtils.closeSession(session); 

    } 

     本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/274832,如需轉載請自行聯系原作者