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

  • 相关阅读:
    共轭梯度法
    OpenGLGLUT教程(十一) GLUT子菜单
    怎样让函数返回数组
    OpenGLGLUT教程(九) GLUT鼠标
    OpenGLGLUT教程(七) GLUT高级键盘控制
    OpenGLGLUT教程(六) GLUT场景漫游
    OpenGLGLUT教程(五) GLUT键盘控制
    OpenGLGLUT教程(八) GLUT场景漫游II
    dos指令 批处理文件
    新的启程!
  • 原文地址:https://www.cnblogs.com/gXing/p/8650397.html
Copyright © 2011-2022 走看看