hibernate多对多关联映射

Posted 球你嘞~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate多对多关联映射相关的知识,希望对你有一定的参考价值。

映射原理:

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

举例:

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

分类:

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

 

对象模型

              技术分享图片

 

关系模型

 

            技术分享图片

实例

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

User

public class User {  
    private int id;  
    private String name;  
      
    private Set roles;  
    ....
}

Role

public class Role {  
    private int id;  
    private String 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>  

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

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

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

User同上

Role

public class Role {  
    private int id;  
    private String name;  
    private Set users;  
...
}

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

 

以上是关于hibernate多对多关联映射的主要内容,如果未能解决你的问题,请参考以下文章

关联映射 ---- Hibernate之多对多关系

hibernate多对多关联映射

hibernate的映射之四(多对多双向关联)

Hibernate之关于多对多单向关联映射

Hibernate学习笔记 --- 创建基于中间关联表的多对多映射关系

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)