`
369540808
  • 浏览: 195679 次
文章分类
社区版块
存档分类
最新评论

ORM框架Hibernate (五) 多对多关联映射

 
阅读更多
  1. 介绍
    1. 这种多对多的情况在我们生活中有很多,比如在你上学的时候花的钱是父母的也是你的,说的更准确一些是父母的,钱和我们可以看作是一对多的关系,又比如你拥有很多东西这些东西又被很多人拥有那么你与这些东西之间就是多对多的关系。
    1. 再举一个例子生活中例子,假如你是高、富、帅或白、瘦、美,说明你同时具有了很多优点,你对应多个优点,但这些优点不是你一个人专有很多人都有,那么它们与人之间就构成了多对多的关系,也希望我们都朝着这个方向发展。
    1. 又比如一个的职位、角色等很多情况下都不会只是一种,可能一个人即是员工又是经理,身兼数职,在系统中我们常常把这种抽象出来在数据库表中展示出来。
    1. 这里我们说一下一个人身兼数职这种对应关系如何从实体映射到关系表中。
  1. 应用场景
    1. 系统中都会有权限管理模块,谈到权限当然就会涉及到参与的用户与权限对应关系,往往一个用户会有多个角色即多个权限,把用户和角色看成两个实体类可以得到他们的UML类图,如下
      1. 从图上可以看出这两个类的多重度都为n,而且是单向关联从用户指向角色,表明知道了一个用户的信息就会得到他的角色信息,反过来不能得到。
    1. 通常多对多的关系需要引入一个关系表维护两个实体类之间得关系,为什么要引入关系表?如果你看了前两篇博客就会觉得真的有必要引入一张表,多对多是一对多的一个升级,你想想一对多的关系在哪里维护,是在任意一张表里呢,在说的具体一点是在多的一方的表里面加入了一个外键,当这种关系由一对多转为多对多时如果不引入一张表,在少的一方将会出现很多重复记录,因此需要引入一个关系表。
    2. 这两个类对应的实体以及映射文件为:
    1. User实体类
      1. package com.bjpowernode.hibernate;
        
        import java.util.Set;
        /**
         * 用户实体类
         * @author LLS
         *
         */
        public class User {
        	//具有的属性
        	private int id;
        	private String name;
        	//保存多的一方的实体信息
        	private Set roles;
        	//getter和setter方法
        	public Set getRoles() {
        		return roles;
        	}
        	public void setRoles(Set roles) {
        		this.roles = roles;
        	}
        	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;
        	}
        	
        }
        

    1. Role实体类
      1. package com.bjpowernode.hibernate;
        
        /**
         * 角色实体类
         * @author LLS
         *
         */
        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;
        	}
        	
        }
        

    1. User.hbm.xml映射文件
      1. <?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 >
        	<class name="com.bjpowernode.hibernate.User" table="t_user">
        		<id name="id">
        			<generator class="native">	
        			</generator>
        		</id>  
        		<property name="name"></property>
        		<!-- 
        			由于这种多对多是单方向的,关系表的维护在用户一端完成。
        			<key>属性默认会把User表的主键加入关系表中,作为一列
        			<many-to-many>会关关联表的主键也加入到关联表中
        			理解了一对多映射,多对多会觉得很简单
        		 --> 
        		<set name="roles" table="t_user_role">
        			<key column="user_id"></key>
        			<many-to-many class="com.bjpowernode.hibernate.Role" column="role_id"/>
        		</set>
        	</class>
        </hibernate-mapping>

    1. Role.hbm.xml映射文件
      1. <?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 >
        	<class name="com.bjpowernode.hibernate.Role" table="t_role">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="name"></property>
        		<set name="users" table="t_user_role">
        			<key column="role_id"></key>
        			<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"></many-to-many>
        		</set>
        	
        	</class> 
        </hibernate-mapping> 

    1. 另外在给大家介绍一个MySql数据库客户端,一直看黑乎乎的屏幕也不是很习惯,今天安装了一个客户端工具Msql manager for mysql,很好用。
    1. 如果想改为双向关联只需要改一改Role配置文件即可,代码如下
      1. <?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 >
        	<class name="com.bjpowernode.hibernate.Role" table="t_role">
        		<id name="id">
        			<generator class="native"></generator>
        		</id>
        		<property name="name"></property>
        		<set name="users" table="t_user_role">
        			<key column="role_id"></key>
        			<many-to-many class="com.bjpowernode.hibernate.User" column="user_id"></many-to-many>
        		</set>
        	
        	</class> 
        </hibernate-mapping> 

      1. 写的映射和在User端一样,需要注意的是column属性必须与User映射文件中对应,负责会出现错误。
  1. 其它映射
    1. 除了一对多、一对一、多对多还有很多映射,例如继承映射、组件映射、主键映射、集合映射等等,就不一一介绍主键映射是组件映射的一种,最重要的还是这三种映射。
分享到:
评论

相关推荐

    Hibernate数据持久层框架.rar

    是一款面向对象的ORM框架,JPA不需要关心数据库字段,通过注解将数据库表与实体完成映射,在java中的操作只需要对实体进行操作即可。 什么是ORM? ORM(Object-Relational Mapping) 表示对象关系映射。在面向对象...

    开源框架:Hibernate Gossip v1.04

    Hibernate 是“物件/关系对应”(Object/Relational Mapping)的解决方案,简写为ORM,简单的说就是将 Java 中的物件与物件关系,映射至关联式资料库中的表格与表格之间的关系, Hibernate 提供了这个过程中自动对应...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    Hibernate的对象化关联处理确实挺强大,但是使用起来坑太多,有多少人敢在项目 中大范围使用真不知道,屠龙刀不是人人都提的起啊。 2、mybatis:轻量级,基于xml的模式感觉不利于封装,代码量不小,基于xml维护也...

    eshop1.0(ssh电子商城)

    ESho1.0版本主要实现项目的创建,数据库的创建与ORM映射. [创建项目与数据库] 1."电子商城系统"EShop应用项目的创建 2.MySQL数据库db_eshop的创建 3.为EShop应用导入Struts...13.配置购物车到商品的多对多单向关联关系

    JavORM框架DarksORM.zip

    支持一对一、一对多、多对一注解方式的关联查询。 支持在实体模型类方法上配置query注解。可直接调用实体方法进行相关查询。 框架全部采用懒加载机制。 支持单对象查询、分页查询、集合查询、级联查询。 默认...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    深入浅出Hibernate中文版 part1

    4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久化实现 5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 ...

    CmSdk4j ORM Framework Beta Edition 1.0 Build in 2009.8.21

    看过Hibernate/iBatis的强大,但对于小型应用而言,却显得过于庞大,于是,我决定自己写一个泛型的简易版ORM框架,仅支持单表数据映射,关联映射业务逻辑请自行处理。 配置非常简单,如果有不清楚的地方,可以到我的...

    深入浅出Hibernate中文版 part2

    4.3 Hibernate O/R映射 4.4 数据关联 4.5 Hibernate数据检索 4.6 HQL实用技术 4.7 自定义持久化实现 第5章 Hibernate高级特性 5.1 Hibernate持久化实现 5.2 Hibernate回调与拦截机制 5.3 Hibernate实用技术 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     15.3 映射双向多对多关联关系  15.3.1 关联两端使用元素  15.3.2 在inverse端使用元素  15.3.3 使用组件类集合  15.3.4 把多对多关联分解为两个一对多关联  15.4 小结  15.5 思考题 第16章 Hibernate的检索...

    hibernate-examples:Hibernate关联,Hibernate搜索和Hibernate集成

    作为ORM框架,hibernate涉及数据持久性,因为它适用于关系数据库。 在此存储库中,您将找到用于理解诸如关系映射的示例。 1. One To One Mapping 2. One To Many Mapping 3. Many To Many Mapping 4. ...

    hibernate_sample:Hibernate JPA示例

    最终,像Hibernate这样的ORM框架开始在开发领域得到认可,并且对它们的需求也在增加,因此JCP开始制定JPA规范。 像Servlet和JSP一样,JPA是一个规范。 实际运行JPA需要参考实现(RI)。 JPA参考实现有几种选择。 ...

    Spring Boot Jpa.docx

    它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。 值得...

    ssh(structs,spring,hibernate)框架中的上传下载

    数据表Blob字段在Hibernate持久化映射文件中的type为org.springframework.orm.hibernate3.support.BlobByteArrayType,即Spring所提供的用户自定义的类型,而非java.sql.Blob。 3在Spring中使用org.springframework...

    rock-0.9开源框架

    rock框架的核心主要是rock-dbutils,rock-dbutils是一个轻量级的ORM框架,对jdbc进行了浅层次的封装。是本人在教学和项目开发中慢慢积累开发而成,用来代替烦人的复杂的hibernate的。使用rock框架开发应用非常简单,...

    Hibernate5教程文档大纲

    HIbernate完整文档,有教程有截图,也有详细步骤,其中包括ORM思想介绍、框架原理、原理图、核心对象、核心配置文件、关联关系、映射文件、批量处理、事务控制、Hibernate缓存以及注解等

    rock-0.9.1开源框架

    rock框架的核心主要是rock-dbutils,rock-dbutils是一个轻量级的ORM框架,对jdbc进行了浅层次的封装。是本人在教学和项目开发中慢慢积累开发而成,用来代替烦人的复杂的hibernate的。使用rock框架开发应用非常简单,...

Global site tag (gtag.js) - Google Analytics