三大框架SSH成长路程(八)

多对多关联映射(八)

多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。

映射原理

 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联。用第三张表来解决可能会造成数据冗余的问题。

举例

一个用户(User)对多个角色(Role),一个角色对多个用户。

分类

单向的多对多关联映射(单向User—>Role)

对象模型
这里写图片描述
关系模型
这里写图片描述

实例
下面我们看一下实体类和映射文件的代码。
User

package com.liang.hibernate;  

import java.util.Set;  

public class User {  
    private int id;  
    private String name;  

    private Set roles;  

    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public Set getRoles() {  
        return roles;  
    }  
    public void setRoles(Set roles) {  
        this.roles = roles;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  

}  

Role

package com.liang.hibernate;  

public class Role {  
    private int id;  
    private String name;  

    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

User.hbm.xml

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liang.hibernate">  
    <class name="User" table="t_user">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
        <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->    
        <set name="roles" table="t_user_role">  
            <!--当前表(User)的主键-->  
            <key column="user_id"></key>  
            <many-to-many class="Role" column="role_id"></many-to-many>  
        </set>  
    </class>  
</hibernate-mapping>  

Role.hbm.xml

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liang.hibernate">  
    <class name="Role" table="t_role">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
    </class>  
</hibernate-mapping>  

生成的表结构和测试数据
这里写图片描述
这里写图片描述

多对多关联映射,在实体类中,跟一对多关联映射一样,也是用集合来表示的。标签中用table属性重命名中间表名称,标签定义当前表的主键,用标签来关联另一张表。

双向的多对多关联映射(双向User<—>Role)

对象模型
这里写图片描述

关系模型

   同上

实例

 下面我们看一下实体类和映射文件的代码。

User

package com.liang.hibernate;  
import java.util.Set;  

public class User {  
    private int id;  
    private String name;  

    private Set roles;  

    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public Set getRoles() {  
        return roles;  
    }  
    public void setRoles(Set roles) {  
        this.roles = roles;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  

}  

Role

package com.liang.hibernate;  
import java.util.Set;  
public class Role {  
    private int id;  
    private String name;  
    private Set users;  

    public Set getUsers() {  
        return users;  
    }  
    public void setUsers(Set users) {  
        this.users = users;  
    }  
    public int getId() {  
        return id;  
    }  
    public void setId(int id) {  
        this.id = id;  
    }  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
}  

User.hbm.xml

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liang.hibernate">  
    <class name="User" table="t_user">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
        <!-- roles属性,表达的是本对象(User)与Role的多对多的关系 -->    
        <set name="roles" table="t_user_role">  
            <!--当前表(User)的主键-->  
            <key column="user_id"></key>  
            <many-to-many class="Role" column="role_id"></many-to-many>  
        </set>  
    </class>  
</hibernate-mapping>  

Role.hbm.xml

<?xml version="1.0"?>  
<!DOCTYPE hibernate-mapping PUBLIC   
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
<hibernate-mapping package="com.liang.hibernate">  
    <class name="Role" table="t_role">  
        <id name="id">  
            <generator class="native"></generator>  
        </id>  
        <property name="name"></property>  
        <!-- users属性,表达的是本对象(Role)与User的多对多的关系 -->    
        <set name="users" table="t_user_role">  
            <!--当前表(Role)的主键-->                  
            <key column="role_id"></key>  
            <many-to-many class="User" column="user_id"></many-to-many>  
        </set>  
    </class>  
</hibernate-mapping>  

生成的表结构和测试数据
这里写图片描述
这里写图片描述

多对多双向关系中,User和Role的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。

总结

  多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值