您的位置:首页 > 其它

【SSH进阶之路】Hibernate映射——多对多关联映射(八)

2015-11-17 20:53 363 查看
多对多映射是现实生活中最常见的映射,也是最容易理解的映射。废话少说,直接开始。

 

映射原理

 

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

 

举例

 

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

 

分类

 

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

 

对象模型

              


关系模型

            


 

实例

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

User

[java] view
plaincopyprint?





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

[java] view
plaincopyprint?





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

[html] view
plaincopyprint?





<?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

[html] view
plaincopyprint?





<?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>  

生成的表结构和测试数据





 

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

 

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

 

 

对象模型

             


关系模型

 

       同上

 

实例

      

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

User

[html] view
plaincopyprint?





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

[java] view
plaincopyprint?





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

[html] view
plaincopyprint?





<?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

[html] view
plaincopyprint?





<?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的映射文件相同,值得注意的是生成的中间表名称必须一样,生成中间表的字段必须一样。

 

总结

 

      多对多关联映射到此就结束了,经过对一对多关联映射的学习,相对而言,多对多关联映射变得非常的简单了,非常像一对多关联映射的变体。

 

      Hibernate的总结篇马上杀到,谢谢关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: