隨筆-61  評論-159  文章-0  trackbacks-0
                     hibernate中多對多關聯(lián)映射(單向),中間需要加入一個表來維護這種多對多關聯(lián)關系。
            例子:        
                    具體映射方式:
           <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、測試保存數(shù)據(jù)方法:
           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("總經(jīng)理");
          12            session.save(role2);
          13            Role role3= new Role();
          14            role3.setName("項目經(jīng)理");
          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,因此不用調(diào)用session.save(role)方法。
          數(shù)據(jù)庫表數(shù)據(jù):
          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 | 總經(jīng)理   |
          |  3 | 項目經(jīng)理 |
          +----+----------+
          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
          查詢結(jié)果:
          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=總經(jīng)理
          role.name=項目經(jīng)理
          role.name=CEO

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



          -------------------------------------------------------------------------------------------------
          PS:本博客文章,如果沒有注明是有“轉(zhuǎn)”字樣,屬于本人原創(chuàng)。如果需要轉(zhuǎn)載,務必注明作者文章的詳細出處地址,否則不允許轉(zhuǎn)載,多謝合作!
          posted on 2008-10-12 21:59 apple0668 閱讀(764) 評論(0)  編輯  收藏 所屬分類: hibernate
          主站蜘蛛池模板: 彰化市| 南阳市| 江安县| 景宁| 贡觉县| 大田县| 东光县| 福鼎市| 安宁市| 滦平县| 南平市| 靖西县| 嘉义市| 九江县| 遂平县| 娄底市| 北京市| 达拉特旗| 朝阳市| 南昌县| 南通市| 永定县| 新乡县| 全州县| 东阿县| 泰安市| 南昌市| 滦平县| 大荔县| 余干县| 乌兰县| 岳西县| 景谷| 上蔡县| 巴彦淖尔市| 来凤县| 资阳市| 三门县| 宜章县| 玉龙| 贡山|