zoukankan      html  css  js  c++  java
  • 【SSH进阶之路】Hibernate映射——多对多关联映射(八)

         上篇博文【SSH进阶之路】Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础。

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

     

    映射原理

     

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

    举例

    一个用户(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>

    生成的表结构和测试数据

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

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

     

    总结

     

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

     

          Hibernate的总结篇马上杀到,谢谢关注。

  • 相关阅读:
    js--在页面元素上(移动到或获取焦点)、鼠标离开(或失去焦点)
    Oracle 树操作、递归查询(select…start with…connect by…prior)
    oracle 错误码查看命令oerr ora及常用错误码总结--不断更新
    Dbvisual连接远程数据库报错Error Code: 17401
    struts2 转发、重定向概述
    javascript array操作
    理解 Node.js 里的 process.nextTick()
    js的in运算符与instanceof运算符
    Javascript引擎单线程机制及setTimeout执行原理说明
    NodeJS错误处理最佳实践
  • 原文地址:https://www.cnblogs.com/ainima/p/6330983.html
Copyright © 2011-2022 走看看