hibernate 多对多映射

一 综述

 

 在权限管理系统中,一个常用的系统为 role  group ,以及之间的关联表privilede  。并且role 与 group之间是多对多

映射 。本文使用了hibernate3.2  。

 

 

二 数据库创建脚本

 

create table role
(
role_id int primary key ,

role_name varchar(20)

);

 

create table gr
(

group_id int primary key ,

group_name varchar(20)

) ;

 

create table privilege
(

role_id int ,

group_id int ,

primary key(role_id , group_id) ,

foreign key (role_id) references role(role_id) ,

foreign key (group_id) references gr(group_id)

) ;

 

 

 

 

三  映射文件中

 

  1 存在三个 数据库的表,但是只存在两个映射文件, 以及两个vo类 。现在将两个映射文件显示如下:

 

 

  Role.hbm.xml 如下:

 

  <hibernate-mapping>
    <class name="cn.bupt.duming.vo.Role" table="role" catalog="login">
       
        <id name="role_id" type="java.lang.Integer">
            <column name="role_id" />
        </id>
       
       
        <property name="role_name" type="java.lang.String">
            <column name="role_name" length="20" />
        </property>
   
        // 表示在Role的vo类中,存在一个集合类,存储Group实例

 

 

  //注意 ,此处的表 table应该为两张表之间的关系表


        <set name="groups" inverse="true" table="privilege" >
            <key>
                <column name="role_id" />
            </key>
            <many-to-many class="cn.bupt.duming.vo.Gr" column="group_id" outer-join ="auto"/>
        </set>
   
    </class>
</hibernate-mapping>

 

 

2 Gr.hbm.xml 文件实例

 

  <hibernate-mapping>
    <class name="cn.bupt.duming.vo.Gr" table="gr" catalog="login">
        <id name="group_id" type="java.lang.Integer">
            <column name="group_id" />
          
        </id>
       
        <property name="group_name" type="java.lang.String">
            <column name="group_name" length="20" />
        </property>

//注意 此处的table 应该为两张表之间的关系表
        <set name="roles" inverse="false" lazy="false" table="privilege">

            <key>
                <column name="group_id" />
            </key>
            <many-to-many class="cn.bupt.duming.vo.Role" column ="role_id" />
        </set>
   
    </class>
</hibernate-mapping>

 

 

 

 

四 实体类  vo类

 

 

 1 Gr.java

 

public class Gr implements Serializable {

     private int group_id ;
     
     private String group_name ;
     
     private Set <Role> roles = new HashSet<Role>() ;

 

 }

 

  2 Role.java

 

 

 public class Role implements Serializable {

    private int role_id ;
   
    private String role_name ;
   
    private Set<Gr> groups = new HashSet<Gr>();

 

}

 

 以上vo类省略了 set 和get 方法。

 

五 测试类

 

Role role1 = new Role() ;
        role1.setRole_id(1) ;
        role1.setRole_name("duming1") ;
       
       
        Role role2 = new Role() ;
        role2.setRole_id(2) ;
        role2.setRole_name("duming2") ;
       
       
        Role role3 = new Role() ;
        role3.setRole_id(3) ;
        role3.setRole_name("duming3") ;
       
       
        Gr group1 = new Gr() ;       
        group1.setGroup_id(1) ;
        group1.setGroup_name("group1") ;
       
       
       
        Gr group2 = new Gr() ;
        group2.setGroup_id(2) ;
        group2.setGroup_name("group2") ;
       
       
        Gr group3 = new Gr() ;       
        group3.setGroup_id(3) ;
        group3.setGroup_name("group3") ;
       
       
        group1.getRoles().add(role1) ;       
        group1.getRoles().add(role2) ;
       
       
        group2.getRoles().add(role2) ;       
        group2.getRoles().add(role3) ;
       
        group3.getRoles().add(role1) ;       
        group3.getRoles().add(role3) ;
       
       
        role1.getGroups().add(group1) ;
        role1.getGroups().add(group2) ;
       
        role2.getGroups().add(group2) ;
        role2.getGroups().add(group3) ;
       
        role3.getGroups().add(group1) ;
        role3.getGroups().add(group3) ;
       
       
        Transaction tc = session.beginTransaction() ;
       
        session.save(group1) ;
       
        session.save(group2) ;
       
        session.save(group3) ;
       
       
        session.save(role1) ;
       
        session.save(role2) ;
       
        session.save(role3) ;

 

 

 

六 输出的sql 语句

 

     Hibernate:
    insert
    into
        login.gr
        (group_name, group_id)
    values
        (?, ?)

 


Hibernate:
    insert
    into
        login.gr
        (group_name, group_id)
    values
        (?, ?)


Hibernate:
    insert
    into
        login.gr
        (group_name, group_id)
    values
        (?, ?)

 


Hibernate:
    insert
    into
        login.role
        (role_name, role_id)
    values
        (?, ?)

 


Hibernate:
    insert
    into
        login.role
        (role_name, role_id)
    values
        (?, ?)

 

Hibernate:
    insert
    into
        login.role
        (role_name, role_id)
    values
        (?, ?)

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

 

Hibernate:
    insert
    into
        privilege
        (group_id, role_id)
    values
        (?, ?)

 

 

七 总结


  两个表之间是多对多的关系,但是在数据库中只存在两表,及其两表之间的关系表(共3张表)。而vo类只需要建立两个

实体类 ,关系表的vo类不需要建立。  同样映射文件也只要配置2个,关系表的映射文件也不需要配置。

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值