`

Hibernate 关联映射

阅读更多

------------------------------------------------

hibernate多对一关联映射

关联映射的本质:
 将关联关系映射到数据库表,关联关系在对象模型中体现为一个或多个引用
 
<many-to-one>会在多的一端添加一个外键,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略这个属性,默认外键与实体类的属性一致

注意:如果实体类的名称和属性与sql的关键字重复,必须重新命名

<many-to-one>标签定义示例:
 * <many-to-one name="group" column="groupid"/>
 
理解级联的含义?
 对象之间的连锁操作 
 
------------------------------------------

hibernate一对一主键关联映射(单向关联Person---->IdCard)

一对一主键关联映射:让两个实体对象的id保持相同,这样可以避免多余的字段被创建

具体映射方式:
 <class name="com.bjsxt.hibernate.Person" table="t_person">
  <id name="id">
   <!-- person的主键来源于IdCard,共享IdCard的主键 -->
   <generator class="foreign">
    <param name="property">idCard</param>
   </generator>
  </id>
  <property name="name"/>
  <!-- one-to-one标签指示hibernate如何加载其引用对象,默认根据主键加载
  constrained="true"表明当前主键上存在一个约束,person的主键作为外键参照了IdCard
   -->
  <one-to-one name="idCard" constrained="true"/>
 </class>

-------------------------------------------------------

hibernate一对一主键关联映射(双向关联Person<---->IdCard)

需要在IdCard中加入<one-to-one>标签指向person,指示hibernate如何加载person
默认根据主键加载

------------------------------------------

hibernate一对一唯一外键关联映射(单向关联Person---->IdCard)

一对一唯一外键关联映射实际上就是多对一关联映射的特例

可以采用<many-to-one>标签,指定多的一端的unique=true,则限制了多的一端的多重性为一
通过这种手段来映射一对一唯一外键关联

----------------------------------------

hibernate一对一唯一外键关联映射(双向关联Person<---->IdCard)

一对一唯一外键双向关联映射,需要在另一端(IdCard),添加<one-to-one>标签,指示hibernate如何
加载其引用对象,默认情况下根据主键加载Person,因为外键关联映射中,因为外键关联映射中两个实体的关系
是通过person中的idCard维护的,所以不能根据person的主键来加载,而是根据person的外键来加载person
对象,如:
<one-to-one name="person" property-ref="idCard"/>

-----------------------------------------------
session.flush测试

session.flush主要做两件事:
 * 清理缓存(脏数据对比)
 * 执行sql

hibernate中sql的执行顺序: 
 hibernate按照save(insert)、update和delete顺序提交相关操作

set transaction isolation level read uncommited


-----------------------------------------------080701

hibernate一对多关联映射(单向关联)

这个映射的本质:采用了多对一映射原理

多对一关联映射:在多的一端加入一个外键,指向一的一端,它维护的是多到一的关系
一对多关联映射:在多的一端加入一个外键,指向一的一端,它维护的是一到多的关系

也就是说一对多和多对一映射策略是一致的,只是站的角度不同

一对多关联映射让hibernate在一的一端维护关系存在缺点:
 * 会发出多余的update语句,建立班级和学生之间的关系,影响性能
 * 如果student表中的classesid设置为非空,将无法保存数据

--------------------

hibernate一对多关联映射(双向关联)

一对多双向关联映射:
 * 在一一端的集合上使用<key>,在对方表中加入一个外键指向一一端
 * 在多一端采用<many-to-one>
 
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段的错误
 
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多
的一端来维护关联关系

关于inverse属性:
 inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
 默认inverse为false,所以我们可以从”一“一端和”多“一端维护关联关系,
 如果设置成inverse为true,则我们只能从多一端来维护关联关系
 
 注意:inverse属性,只影响数据的存储,也就是持久化
  
inverse和cascade
 * inverse是关联关系的控制方向
 * cascade操作上的连锁反应
 
------------------------------

hibernate多对多关联映射(单向关联)

映射方法:

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

hibernate多对多关联映射(双向关联)

映射方法:
  <set name="roles" table="t_user_role">
   <key column="userid"/>
   <many-to-many class="com.bjsxt.hibernate.Role" column="roleid"/>
  </set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致
------------------------------------------------------

lazy策略可以应用在:
 * <class>标签上,可以取值true/false
 * <property>标签上,可以取值true/false,需要类增强工具
 * <set><list>集合标签上,可以取值true/false/extra
 * <one-to-one>、<many-to-one>单端关联上,可以取值false/proxy/noproxy
 
lazy的概念:在正真使用的时候发出查询语句加载相应的对象

hibernate支持lazy策略只有在session打开状态下才有效

hibernate类级别的lazy只对普通属性起作用,可以控制什么时候加载这些普通属性 

---------------------------------
hibernate在集合上的lazy策略:可以取值true/false/extra

true:默认取值,它的意思是只有在调用这个集合获取里面的元素对象时,才发出查询语句,加载其
     集合元素的数据
false:取消lazy特性,即在加载对象的同时,就发出第二条查询语句加载其关联集合的数据
extra:一种比较聪明的lazy策略,即调用集合的size等方法的时候,hibernate 并不会去
      加载整个集合的数据,而是发出一条聪明的SQL语句,以便获得需要的值,只有在真正需
      要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据

<class>标签上配置的lazy不会影响到集合上的lazy特性

-----------------------------------------------

hibernate在单端关联上的lazy策略可以取值:false/proxy/noproxy

false:取消lazy策略,即在加载对象的同时,发出查询语句,加载其关联对象
proxy:这是hibernate对单端关联的默认lazy策略,即只有在调用到其关联对象的方法的时候
      才真正发出查询语句查询其对象数据,其关联对象是代理类
no-proxy:这种lazy特性需要对类进行增强,使用no-proxy,其关联对象不是代理类

<class>标签上配置的lazy不会影响到单端关联对象上的lazy特性

分享到:
评论

相关推荐

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate关联映射的...

    hibernate关联映射实例

    本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中至关重要的概念。 1. **一对多关联映射**: 在现实世界中,一个实体可能会与多个其他实体相关联,...

    hibernate关联映射的作用和常用属性解释

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    Hibernate关联映射

    在 Hibernate 映射中,需要使用 `one-to-one` 元素,并设置 `constrained="true"`,表明该类的主键由关联类生成。 3. Hibernate 一对一连接表单向关联: 这种关联方式是通过额外的连接表来实现一对一关系的。连接...

    Hibernate关联映射.rar

    本教程“Hibernate关联映射.rar”聚焦于Hibernate中的关联映射,特别是多对一和一对多的关系映射,非常适合初学者了解和实践。 首先,我们要理解什么是关联映射。在数据库中,表与表之间存在各种关系,如一对一、一...

    hibernate 全面学习->hibernate 关联映射学习

    总的来说,这个压缩包提供了丰富的Hibernate关联映射的学习资源,涵盖了从基础到进阶的各种关联类型。通过学习这些示例,你将能够熟练掌握如何在Java项目中使用Hibernate进行数据持久化,并灵活地处理各种数据库关系...

    hibernate 关联映射(一) many to one

    本文将深入探讨“Hibernate关联映射中的Many-to-One关系”。 Many-to-One关联是现实世界中常见的关系类型,比如一个学生可以对应多个课程,而一个课程可能被多个学生选修。在数据库中,这通常表现为一对多(One-to-...

    hibernate关联映射

    hibernate关联映射是Hibernate框架中的一个重要概念,它用于在Java对象模型和数据库表之间建立关系,使得数据操作更加方便。以下将详细介绍各种类型的关联映射: 1. **单向N-1关联(无连接表)** 在这种关联中,一...

    hibernate关联映射详解SSH 多对多,一对多关系对象映射

    在Java的持久化框架Hibernate中,关联映射是至关重要的概念,它允许我们将数据库中的表关系映射到对象之间的关系。SSH(Struts、Spring、Hibernate)是经典的Java Web开发框架,其中Hibernate负责数据访问层,提供了...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    hibernate 关联映射(二) one to one(单向)

    本篇文章将深入探讨Hibernate中的关联映射,特别是One-to-One(一对一)关联,这是一种表示两个实体之间一对一关系的映射方式。我们将通过源码分析和实际例子来理解其工作原理。 ### 一、One-to-One关联概述 在...

    hibernate 关联映射(三) one to one(双向)

    在Java的持久化框架Hibernate中,关联映射是核心特性之一,它允许我们将数据库中的表关系映射到对象之间的关系。本篇将深入探讨一种特殊的关联映射方式——一对一(One to One)映射,特别是在双向关联的情况下的...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型映射方式。这种关联通常发生在两个实体之间,且每个实体都只有一个对应的实例。本篇文章将详细探讨双向一对一主键关联映射...

Global site tag (gtag.js) - Google Analytics