随笔-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 阅读(755) 评论(0)  编辑  收藏 所属分类: hibernate

只有注册用户登录后才能发表评论。


网站导航: