hibernate 多对多关联

多对多关联是常见的一种关联关系,如User与Role,一个用户可以对应多个角色,一个角色也可以对应多个用户。

要理解这个映射关系,必须了解set及many-to-many这两个标签中的相关属性。

下面以User与Role为例:

1.POJO类

User类

Java代码  收藏代码
  1. public class User {  
  2.   
  3.     private int userId;  
  4.     private String userName;  
  5.     private Set roles;  
  6. //...set/get  
  7. }  

 Role类

Java代码  收藏代码
  1. public class Role {  
  2.   
  3.     private int roleId;  
  4.     private String roleName;  
  5.     private Set users;  
  6. //...get/set  
  7. }  

 2.映射文件

User.hbm.xml

Java代码  收藏代码
  1. <hibernate-mapping package="org.zengge.hibernate.manytomany.pojo">  
  2.     <class name="User" table="t_user">  
  3.         <id name="userId" type="integer">  
  4.             <generator class="identity"></generator>  
  5.         </id>  
  6.         <property name="userName" type="string" ></property>  
  7.         <set name="roles" table="t_role_user">  
  8.             <key column="userId"/>  
  9.             <!-- key定义集合表到其拥有表的外键 -->  
  10.             <many-to-many class="Role" column="roleId"/>  
  11.             <!-- many-to-many 集合表到该元素的外键 -->  
  12.         </set>  
  13.     </class>  
  14. </hibernate-mapping>  

 Role.hbm.xml

Java代码  收藏代码
  1. <hibernate-mapping package="org.zengge.hibernate.manytomany.pojo">  
  2.     <class name="Role" table="t_role">  
  3.         <id name="roleId" type="integer">  
  4.             <generator class="identity"></generator>  
  5.         </id>  
  6.         <property name="roleName" type="string" ></property>  
  7.         <set name="users" table="t_role_user">  
  8.             <key column="roleId"/>  
  9.             <!-- key中的 property-ref用于指定主非键的列作为参考外键,也就是说默认情况下会用主表的主键作为  
  10.                 集合表的外键,在这里就是默认为t_role的主键作为t_role_user的外键  
  11.              -->  
  12.             <many-to-many class="User" column="userId" />  
  13.             <!--  
  14.                 column(必需):   这个元素的外键关键字段名    
  15.                 property-ref:   用于指定关联类(User)连接到外键的属性,即那个字段与集合表t_role_user中的  
  16.                 userId关联,如果没指定就默认为关联类(User)的主键  
  17.               -->  
  18.         </set>  
  19.         <!--   
  20.             使用<key>元素来申明从集合表到其拥有者类的表  
  21.             (from the collection table to the table of the owning class)的外键关键字。       
  22.              <key column="column_name"/>     
  23.              column(必需):外键字段的名称       
  24.          -->  
  25.     </class>  
  26. </hibernate-mapping>  

 set用于映射集合,name表示属性名称,table表示集合对应的集合表

key:用于定义连接表中的外键,默认引用主表中的主键作外键

     column表示外键名称

     property-ref,上面有讲

 

对于key与many-to-many的作用就在于定义好集合表中的外键名称,及外键引用的是主表中的那个字段.

3.测试

导出表

Java代码  收藏代码
  1. public static void exportSchema(){  
  2.         SchemaExport schemaExport = new SchemaExport(configuration);  
  3.         schemaExport.create(truetrue);  
  4.     }  

 结果为

create table t_role (roleId integer not null auto_increment, roleName varchar(255), primary key (roleId))
create table t_role_user (userId integer not null, roleId integer not null, primary key (roleId, userId))
create table t_user (userId integer not null auto_increment, userName varchar(255), primary key (userId))
alter table t_role_user add index FK32E9F7E9217E219A (roleId), add constraint FK32E9F7E9217E219A foreign key (roleId) references t_role (roleId)
alter table t_role_user add index FK32E9F7E926D37704 (userId), add constraint FK32E9F7E926D37704 foreign key (userId) references t_user (userId)
构建了三张表,两张主表,一张中间表,并取主表主键作为中间表的外键。

posted @ 2012-11-30 10:59  哲服  阅读(127)  评论(0编辑  收藏  举报