`

hibernate常见映射关系总结

 
阅读更多

 首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。Hibernate正是实现了这种思想,达到了方便开发人员以面向对象的思想来实现对数据库的操作。

 

Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java)、映射文件(*.hbm.xml)和数据库配置文件(*.properties/*.cfg.xml),它们各自的作用如下:

映射类*.java:它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

映射文件(*.hbm.xml:它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

数据库配置文件(*.properties/*.cfg.xml:它是指定与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。当然还可以把映射类的地址映射信息放在这里。

接下来让我们就一起走进Hibernate的七种映射关系:

1、 单向一对一关联映射(one-to-one):

两个对象之间一对的关系,例如:Person(人)-IdCard(身份证)

有两种策略可以实现一对一的关联映射:

*主键关联:即让两个对象具有相同的主键值,以表明它们之间的一一对应的关系;数据库表不会有额外的字段来维护它们之间的关系,仅通过表的主键来关联。如下图:




 
                                            单向一对一主键关联例子连接

关键映射代码——在Person端加入如下标签映射: 

 

<class name="Person" table="person">
		<id name="id">
			<generator class="foreign">
			  <param name="property">card</param>
			</generator>
		</id>
		<property name="name" column="name" not-null="true"/>
		<!-- constrained="true"表明该类主键由关联类生成 -->
		<one-to-one name="card" constrained="true"></one-to-one>
	</class>

 

*唯一外键关联:外键关联,本来是用于多对一的配置,但是加上唯一的限制之后(采用<many-to-one>标签来映射,指定多的一端uniquetrue,这样就限制了多的一端的多重性唯一),也可以用来表示一对一关联关系,其实它就是多对一的特殊情况。如下图:
 

                                            单向一对一唯一外键关联例子连接

关键映射代码——在Person端加入如下标签映射: 

 

<many-to-one name="card"  class="Card" cascade="save-update" unique="true"   
                      column="idCard" not-null="true">  
        </many-to-one>  

 

注意:因为一对一的主键关联映射扩展性不好,当我们的需要发生改变想要将其变为一对多的时候变无法操作了,所以我们遇到一对一关联的时候经常会采用唯一外键关联来解决问题,而很少使用一对一主键关联。

 

  2、 双向一对一关联映射

 

对比单向一对一映射,需要在IdCard加入<one-to-one>标签,只影响加载。如下图

 



 
双向一对一主键映射关键映射代码——在IdCard端新加入如下标签映射

 

 

<one-to-one name="person" cascade="save-update" ></one-to-one> 

  双向一对一唯一外键映射关键映射代码——在IdCard端新加入如下标签映射

 

 

<one-to-one name="person"property-ref="idCard"/>

 
 

 

  3、 单向多对一关联映射(many-to-one):

多对一关联映射原理:在多的一端加入一个外键,指向一的一端,如下图:



 关键映射代码——在多的一端加入如下标签映射: 

<many-to-one name="group"  class="Group" cascade="save-update" >
		       
      <column name="groupid" not-null="true"></column>
		
</many-to-one>

4、 单向一对多关联映射(one-to-many)

一对多关联映射和多对一关联映射原理是一致的,都是在多的一端加入一个外键,指向一的一端。如下图(学生和班级):



    关键映射代码——在一的一端加入如下标签映射:

<set name="students"  cascade="save-update">
			
         <key column="classesid" not-null="true"></key>
			
			
          <one-to-many class="com.org.Student"/>     
</set>

 注意:它与多对一的区别是维护的关系不同

*多对一维护的关系是:多指向一的关系,有了此关系,加载多的时候可以将一加载上来

*一对多维护的关系是:一指向多的关系,有了此关系,在加载一的时候可以将多加载上来

   缺陷:因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系)所以在保存Student的时候关系字段classesid是为null的,如果将该关系字段设置为非空,则将无法保存数据,常用解决办法是改用双向关联映射

 

 

5、 双向一对多关联映射(非常重要)

 

采用一对多双向关联映射的目的主要是为了主要是为了解决一对多单向关联的缺陷而不是需求驱动的。

 

一对多双向关联的映射方式:

 

* 在一的一端的集合上采用<key>标签,在多的一端加入一个外键

 

* 在多的一端采用<many-to-one>标签

 

注意:<key>标签和<many-to-one>标签加入的字段保持一直,否则会产生数据混乱

 

关键映射代码:

 

在Classes的一端加入如下标签映射:

 

          <set name="students"inverse="true">
                 <key column="classesid"/>
                <one-to-many class="com.hibernate.Student"/>
          </set>

   注释:inverse属性

inverse属性可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inverse为true,则本端不能维护关系,会交给另一端维护关系,本端失效。所以一对多关联映射我们通常在多的一端维护关系,让一的一端失效. 

 

在Student的一端加入如下标签映射:

 

         <many-to-one name="classes" column="classesid"/>

      

 

6、 单向多对多映射(many-to-many):

多对多关联映射新增加一张表才完成基本映射,如下图:



 

 关键映射代码——可以在User的一端加入如下标签映射:

       <set name="roles" table="t_user_role">
            <key column="user_id"/>
            <many-to-many class="com.hibernate.Role" column="role_id"/>
       </set>

 7、 双向多对多关联映射

双向的目的就是为了两端都能将对方加载上来,和单向多对多的区别就是双向需要在两端都加入标签映射,需要注意的是:

* 生成的中间表名称必须一样

* 生成的中间表中的字段必须一样

Role(角色)端关键映射代码:

 

            <set name="users" table="t_user_role">
                   <key column="role_id"/>
                   <many-to-many class="com.hibernate.User" column="user_id"/>
           </set>

 User(用户)端关键映射代码:

 

              <set name="roles" table="t_user_role">
                    <key column="user_id"/>
                    <many-to-many class="com. hibernate.Role" column="role_id"/>
             </set>

 

  • 大小: 31.8 KB
  • 大小: 33.8 KB
  • 大小: 36.2 KB
  • 大小: 32.3 KB
  • 大小: 16.5 KB
  • 大小: 11.5 KB
分享到:
评论

相关推荐

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate+中文文档

    11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查...

    hibernate3.2中文文档(chm格式)

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    Hibernate中文详细学习文档

    11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查...

    Hibernate 中文 html 帮助文档

    11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application...

    Hibernate教程

    12.1.4. 常见问题 12.2. 数据库事务声明 12.2.1. 非托管环境 12.2.2. 使用JTA 12.2.3. 异常处理 12.3. 乐观并发控制(Optimistic concurrency control) 12.3.1. 应用程序级别的版本检查(Application version ...

    hibernate 体系结构与配置 参考文档(html)

    常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application...

    hibernate3.04中文文档.chm

    12.1.4. 常见问题 12.2. 数据库事务声明 12.2.1. 非托管环境 12.2.2. 使用JTA 12.2.3. 异常处理 12.3. 乐观并发控制(Optimistic concurrency control) 12.3.1. 应用程序级别的版本检查(Application version ...

    hibernate 框架详解

    常见问题 12.2. 数据库事务声明 12.2.1. 非托管环境 12.2.2. 使用JTA 12.2.3. 异常处理 12.3. 乐观并发控制(Optimistic concurrency control) 12.3.1. 应用程序级别的版本检查(Application version ...

    Hibernate参考文档

    11.1.4. 常见问题 11.2. 数据库事务声明 11.2.1. 非托管环境 11.2.2. 使用JTA 11.2.3. 异常处理 11.2.4. 事务超时 11.3. 乐观并发控制(Optimistic concurrency control) 11.3.1. 应用程序级别的版本检查(Application...

    收集的常见的专业问题解决办法.rar

    2009-02-24 08:39 1423088 975149 常见的专业问题解决办法\Java中多态变量的讨论和总结.mht 2009-02-24 08:52 156256 34316 常见的专业问题解决办法\Java中的强制类型转换_Believe ┭┮ YourSelf.mht 2009-02-24 08:...

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

     您可以使用Hibernate Middlegen、HIbernate Tools、Hibernate Syhchronizer等工具或手工的方式,编写Hibernate的领域对象和映射文件。其中对应T_FILE表的领域对象Tfile.java为:  代码 1 领域对象Tfile 1. ...

    在C#项目中如何使用NHibernate详解

    C#可用以解决对象/关系数据库映射的工具有多种,常见的有EF (Entity Framework)、NHibernate、iBATIS等,各自的优缺点及适用场景在此不做讨论,本文只对如何使用NHibernate做个总结。 NHibernate是一个面向.NET环境...

    【计算机软件毕业设计】二手车交易平台的分析、设计与实现文献综述1.doc

    文献综述 摘 要 Web开发技术和Web开发框架整合实践研究是这个时代的一个热点,本文在参阅国内 外Web开发技术和Web开发框架及主要几个框架相关文献的基础上,对Web开发框架研究作 了较为全面的总结和梳理,并结合Web...

    ARCH4系统开发指南

    2.12.4 代码双击域的常见问题 28 2.13 表单提交时调用的JS函数 28 2.13.1 submitFormToSave(form, funcSubmit) 28 2.13.2 submitFormWithoutConfirm(form, funcSubmit) 28 2.13.3 为什么要引入funcSubmit参数 29 ...

    Java学习笔记-个人整理的

    {1.3.1}总结}{23}{subsection.1.3.1} {1.4}数据类型}{23}{section.1.4} {1.4.1}整数与浮点数}{23}{subsection.1.4.1} {1.4.1.1}浮点数原理}{24}{subsubsection.1.4.1.1} {1.4.2}格式化输出浮点数}{24}{...

    Spring.3.x企业应用开发实战(完整版).part2

    14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 ...

    Spring3.x企业应用开发实战(完整版) part1

    14.3 其他常见O/X Mapping开源项目 14.3.1 JAXB 14.3.2 XMLBeans 14.3.3 Castor 14.3.4 JiBX 14.3.5 总结比较 14.4 与Spring OXM整合 14.4.1 Spring OXM概述 14.4.2 整合OXM实现者 14.4.3 如何在Spring中进行配置 ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    (3)针对页面自适应问题,本文结合渐进增强以及拥抱流式布局的思想,同时研究利用了移动设备的视口特性,实现跨分辨率、跨设备的页面自适应。 (4)针对系统的功能实现问题,通过结合利用原生态框架与HTML5的跨平台...

Global site tag (gtag.js) - Google Analytics