Hibernate 关联映射 之 多对多 关联(二) 之拆分

来源:互联网 发布:手机上的编程软件 编辑:程序博客网 时间:2024/06/06 17:28

1、由问题引出一个多对多拆分成两个多对一

    问题:Hibernate 关联映射 之 多对多 关联(一)中中间表只是一个存放用户和角色的表,并无其他作用,如果客户有其他的需求,该表就无法扩展。

2、问题解决过程:

用户、角色 之间的关系拆分成用户和用户角色、角色和用户角色的关系,即:两个多对一的关系。

小技巧:如何去判断多对一还是一对多对象,要从对象的角度来看,即:从一个对象的角度去看另一个对象。

用户:

[java] view plain copy print?
  1. public class User {  
  2.   
  3.     private int id;  
  4.     private String name;  
  5.     private String password;  
  6.     private Set<UserRole> roles;  

用户配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>  
  2.     <class name="com.shangxuetang.User" table="t_user">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="name"></property>  
  7.         <property name="password"></property>  
  8.         <set name="roles">  
  9.             <key column="userID"></key>  
  10.             <one-to-many class="com.shangxuetang.UserRole"/>  
  11.         </set>  
  12.     </class>  
  13. </hibernate-mapping>  

角色:

[java] view plain copy print?
  1. public class Role {  
  2.     private int id;  
  3.     private String name;  
  4.     private Set<UserRole> users;  

角色配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>  
  2.     <class name="com.shangxuetang.Role" table="t_role">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="name"></property>  
  7.         <set name="users">  
  8.              <key column="roleID"></key>  
  9.              <one-to-many class="com.shangxuetang.UserRole"/>  
  10.         </set>  
  11.     </class>  
  12. </hibernate-mapping>  

用户角色:

[java] view plain copy print?
  1. public class UserRole {  
  2.   
  3.     private int id;  
  4.     private User user;  
  5.     private Role role;  
  6.     private Date assignTime;  
  7.       
  8.     public UserRole() {}  
  9.     public UserRole(User u,Role r) {  
  10.         this.user = u;  
  11.         this.role = r;  
  12.         this.assignTime = new Date();  
  13.     }  

用户角色配置文件:

[html] view plain copy print?
  1. <hibernate-mapping>  
  2.     <class name="com.shangxuetang.UserRole" table="t_userrole">  
  3.         <id name="id">  
  4.             <generator class="native"/>  
  5.         </id>  
  6.         <property name="assignTime" type="date"></property>  
  7.         <many-to-one name="user" column="userID"></many-to-one>  
  8.         <many-to-one name="role" column="roleID"></many-to-one>  
  9.           
  10.     </class>  
  11. </hibernate-mapping>  

测试示例代码:

[java] view plain copy print?
  1. public void  testManytoManyChaiFen() {  
  2.         Session session = HibernateUtil.getSession();  
  3.         try {  
  4.             session.beginTransaction();  
  5.               
  6.             User u1 = new User("zhangsan");  
  7.             session.save(u1);  
  8.             User u2 = new User("lisi");  
  9.             session.save(u2);  
  10.               
  11.             Role r1 = new Role("adminstor");  
  12.             session.save(r1);  
  13.             Role r2 = new Role("usualuser");  
  14.             session.save(r2);  
  15.             Role r3 = new Role("VIPuser");  
  16.             session.save(r3);  
  17.               
  18.             UserRole ur1 = new UserRole(u1,r1);  
  19.             session.save(ur1);  
  20.               
  21.             UserRole ur2 = new UserRole(u1,r2);  
  22.             session.save(ur2);  
  23.               
  24.             UserRole ur3 = new UserRole(u2,r1);  
  25.             session.save(ur3);  
  26.               
  27.             UserRole ur4 = new UserRole(u2,r3);  
  28.             session.save(ur4);  
  29.               
  30.             UserRole ur5 = new UserRole(u2,r2);  
  31.             session.save(ur5);  
  32.               
  33.             session.getTransaction().commit();  
  34.         }catch(Exception e) {  
  35.             e.printStackTrace();  
  36.             session.getTransaction().rollback();  
  37.         }finally {  
  38.             session.close();  
  39.         }  
  40.     }  

0 0
原创粉丝点击