隨筆-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 閱讀(762) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 汉阴县| 思南县| 灵川县| 丽江市| 包头市| 鄱阳县| 莒南县| 松阳县| 东阳市| 缙云县| 外汇| 庆阳市| 金门县| 读书| 江油市| 抚顺县| 延庆县| 冷水江市| 高阳县| 武陟县| 油尖旺区| 日照市| 册亨县| 新河县| 柳河县| 沁阳市| 伊川县| 榕江县| 广元市| 通海县| 昌都县| 山阳县| 璧山县| 金阳县| 汉寿县| 枞阳县| 西乌| 普格县| 杨浦区| 乐亭县| 衡山县|