隨筆-61  評論-159  文章-0  trackbacks-0
                     hibernate中多對多關聯映射(單向),中間需要加入一個表來維護這種多對多關聯關系。
            例子:        
                    具體映射方式:
           <set name="roles" table="t_user_role">
            <key column="userid"/>
            <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
           </set>

                   
          1、User的POJO類
           1import java.util.Set;
           2
           3public class User {
           4    
           5    private int id;
           6    
           7    private String name;
           8    
           9    private Set roles;
          10//省略setter、getter方法
          11}
          2、Role的POJO類
          1public class Role {
          2    
          3    private int id;
          4    
          5    private String name;
          6//省略setter、getter方法
          7}

          3、User的映射文件User.hbm.xml
           1<?xml version="1.0"?>
           2<!DOCTYPE hibernate-mapping PUBLIC 
           3    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           4    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
           5<hibernate-mapping>
           6    <class name="org.apple.hibernate.User" table="t_user">
           7        <id name="id">
           8            <generator class="native"/>
           9        </id>
          10        <property name="name"/>
          11        <set name="roles" table="t_user_role">
          12            <key column="userid"/>
          13            <many-to-many column="roleid" class="org.apple.hibernate.Role"/>
          14        </set>
          15    </class>
          16</hibernate-mapping>

          4、Role的映射文件Role.hbm.xml
           1<?xml version="1.0"?>
           2<!DOCTYPE hibernate-mapping PUBLIC 
           3    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
           4    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
           5<hibernate-mapping>
           6    <class name="org.apple.hibernate.Role" table="t_role" >
           7        <id name="id">
           8            <generator class="native"/>
           9        </id>
          10        <property name="name"/>
          11    </class>
          12</hibernate-mapping>
          5、測試保存數據方法:
           1public void testSave()
           2    {
           3        Session session = null;
           4        try {
           5            session = HibernateUtil.getSession();
           6            session.beginTransaction();
           7            Role role1 = new Role();
           8            role1.setName("CEO");
           9            session.save(role1);
          10            Role role2 = new Role();
          11            role2.setName("總經理");
          12            session.save(role2);
          13            Role role3= new Role();
          14            role3.setName("項目經理");
          15            session.save(role3);
          16            User user1 = new User();
          17            user1.setName("張三");
          18            Set user1role = new HashSet();
          19            user1role.add(role1);
          20            user1role.add(role2);
          21            user1role.add(role3);
          22            user1.setRoles(user1role);
          23            
          24            User user2 = new User();
          25            user2.setName("李四");
          26            Set user2role = new HashSet();
          27            user2role.add(role1);
          28            user2role.add(role2);
          29            user2.setRoles(user2role);
          30            session.save(user1);
          31            session.save(user2);
          32            session.beginTransaction().commit();
          33            
          34            
          35        }
           catch (Exception e) {
          36            e.printStackTrace();
          37            session.beginTransaction().rollback();
          38            
          39        }
          finally{
          40            session.close();
          41        }

          42    }
          PS:由于t_user_role中的字段都是參照t_user中的id和t_role的id,因此不用調用session.save(role)方法。
          數據庫表數據:
          mysql> select *from t_user_role;
          +--------+--------+
          | userid | roleid |
          +--------+--------+
          |      1 |      1 |
          |      2 |      1 |
          |      1 |      2 |
          |      2 |      2 |
          |      1 |      3 |


          mysql> select *from t_user;
          +----+------+
          | id | name |
          +----+------+
          |  1 | 張三 |
          |  2 | 李四 |
          +----+------+


          mysql> select *from t_role;
          +----+----------+
          | id | name     |
          +----+----------+
          |  1 | CEO      |
          |  2 | 總經理   |
          |  3 | 項目經理 |
          +----+----------+
          6、測試查詢方法:
           1public void testLoad1()
           2    {
           3        Session session = null;
           4        try {
           5            session = HibernateUtil.getSession();
           6            session.beginTransaction();
           7            
           8            session.beginTransaction().commit();
           9            User user = (User)session.load(User.class1);
          10            System.out.println("user.name="+user.getName());
          11            for(Iterator it = user.getRoles().iterator();it.hasNext();)
          12            {
          13                Role role = (Role)it.next();
          14                System.out.println("role.name="+role.getName());
          15            }

          16            
          17            
          18        }
           catch (Exception e) {
          19            e.printStackTrace();
          20            session.beginTransaction().rollback();
          21            
          22        }
          finally{
          23            session.close();
          24        }

          25    }

          26
          查詢結果:
          Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_ from t_user user0_ where user0_.id=?
          user.name=張三
          Hibernate: select roles0_.userid as userid1_, roles0_.roleid as roleid1_, role1_.id as id2_0_, role1_.name as name2_0_ from t_user_role roles0_ left outer join t_role role1_ on roles0_.roleid=role1_.id where roles0_.userid=?
          role.name=總經理
          role.name=項目經理
          role.name=CEO

          PS:由于一個人可能有多個角色,要把一個人對應的角色迭代出來。



          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉”字樣,屬于本人原創。如果需要轉載,務必注明作者文章的詳細出處地址,否則不允許轉載,多謝合作!
          posted on 2008-10-12 21:59 apple0668 閱讀(763) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 历史| 且末县| 邢台县| 桃江县| 木里| 满城县| 汝南县| 赤城县| 如东县| 唐山市| 顺平县| 铜川市| 民丰县| 安西县| 西吉县| 甘德县| 焦作市| 滨海县| 定襄县| 安吉县| 峡江县| 桂林市| 张家界市| 桐梓县| 金门县| 盐山县| 昌吉市| 宁安市| 桃园县| 娄底市| 和顺县| 滨州市| 庄浪县| 玛曲县| 榆中县| 左贡县| 大关县| 哈巴河县| 惠安县| 鄂州市| 分宜县|