Hibernate是一种能实现ORM的框架。

ORM即Object
Relational Mapping。对象关系映射。也就是将关系数据库中表的数据映射成为对象。也就是说将表与表之间的操作映射成对象与对象之间的操作,通过实体类来达到操作表的目的。总之就是把对数据库的操作转化为对对象的操作,从而更体现了面向对象的思想。

一对一关联映射策略包含主键关联和唯一外键关联。

单向一对一

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1dGVuZ3RlbmcxMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

主键关联

让两个对象有同样的主键值,表名它们之间的一对一关系。数据库没有额外的字段来维护它们之间的关系,只通过表的主键来关联。例如以下图:通过两个表中id来维护关系。没有额外的字段或者表去维护其之间的关系。

从图中可看出,既然是单向关联,那么Person能够持有IdCard对象。而IdCard对象不知道Person的存在。故因此由Person端来维护关系。

Person.hbm.xml关系代码

<class name="com.bjpowernode.hibernate.Person" table="t_person">
<id name="id">
<generator class="foreign">
<!--property仅仅关联对象-->
<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>

IdCard.hbm.xml代码

<class name="com.bjpowernode.hibernate.Person" table="t_idCard">
<id name="id">
<generator class="native">
</id>
<property name="cardNo"/> </class>

唯一外键关联

外键关联被拿来是用于多对一的配置。可是假设加上唯一的限制之后。也能够用来表示一对一的关联关系。因此唯一外键关联是多对一的一种特殊情况。是通过<many-to-one>映射的。

表关系:

通过<many-to-one>映射。会在person端生成idCard字段。通过idCard字段来维护关系。

unique表示是唯一外键关联。故还是通过person端来维护关系,所以和主键关联对照仅仅须要更改person关系中的标签为<many-to-one>,不须要更改idCard关系代码。

主要改变的是Person类的映射:

<class name="com.bjpowernode.hibernat.Person" table="t_person">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<!--设置idCard为外键,唯一标识为true-->
<many-to-one name="idCard" unique="true"/>
</class>

小结:通过表关系能够看出来,主键关联是通过person表中的id来维护关系,没有多余的字段,相当于id既当主键又当外键。改动数据非常难;而唯一外键关联是增加第三个字段来维护关系。可扩展性显然比主键关联好。

——————————————————————————————————————————————

双向一对一

主键关联

上面是单向的,那么设置成双向的。也就是IdCard也想得到与之相应的Person对象。那么IdCard就须要增加person属性。例如以下:

Person关系映射同主键关联映射。

idCard关系映射:

<class name="com.bjpowernode.hibernate.Person" table="t_idCard">
<id name="id">
<generator class="native">
</id>
<property name="cardNo"/>
<one-to-one name="person"/>
</class>

比起单向关联外。双向关联的关系在IdCard端增加<one-to-one>标签。idCard也持有Person的引用。<one-to-one>标签不影响存储,仅仅影响载入,故单向关联和双联关联的表结构是一样的。

唯一外键关联

表关系:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1dGVuZ3RlbmcxMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

同单向关联的关系一样。生成的表结构也一样。

person关系代码同单向。

idCard关系代码:

<class name="com.bjpowernode.hibernate.Person" table="t_idCard">
<id name="id">
<generator class="native">
</id>
<property name="cardNo"/>
<!--体现双向关联-->
<one-to-one name="person" property-ref="idCard"/>
</class>

相同是在idCard端增加关联<one-to-one>标签。

须要加如property-ref="idCard",为关系字段的名称。

由于idCard不为主键,所以要增加此属性。

———————————————————————————————————————————————

综上。单向和双向的差别就是对关系的持有,在idCard端加入<one-to-one>标签,此标签不影响存储,仅仅影响载入。所以上面四种关系能够看成是两种关系,主键关联和唯一外键关联。而主键关联和唯一外键关联的差别是主外键的关系。前者是Person中id是主键又是外键。后者是加入一个关系字段作为外键。可是都是Person来维护关系。

通过总结,对照之后特别清晰,简单易懂。下篇博客继续分析。

【Hibernate学习】 ——ORM(一)的更多相关文章

  1. 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化

    准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...

  2. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  3. Hibernate学习总汇

    Hibernate的基础知识 什么是框架? 什么是Hibernate框架? |--1.应用在javaee三层结构中的dao层 |--2.在dao层里面做对数据库进行crud操作,使用hibernate ...

  4. Hibernate学习笔记一 使用idea开发工具搭建框架

    1.导包,包下载地址:http://hibernate.org/orm/downloads/ 2.创建数据库,准备表,实体.示例: CREATE TABLE `cst_customer` ( `cus ...

  5. hibernate学习(1)

    对象的持久化 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中 广义的理解,“持久化”包括和数据库相关的各种操作 -保存:把对象永久保存到数据库中 -更新:更新数据库中对象的状态 -删除:从数据库 ...

  6. hibernate学习-HibernateDemo

    上篇文章我们讲述了eclipse安装hibernate插件的过程,这篇文章我们来做第一个HibernateDemo. 1).hibernate的jar开发包的下载,官网下载地址:http://hibe ...

  7. Hibernate学习之——搭建log4j日志环境

    昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...

  8. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  9. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  10. Hibernate学习总结

    首先声明这是个坑爹的框架 属于ssh经典框架中的持久层框架,说白了就是管理数据库的. 下载地址:http://hibernate.org/orm/ 这里写了版本5.2,下载下来的基本不怎么会用,因为文 ...

随机推荐

  1. OJB

    OJB 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 对象关系桥(OJB)是一种对象关系映射工具,它能够完成从Java对象到关系数据库的透明存储.   英文名 OJB ...

  2. leetcode_712. Minimum ASCII Delete Sum for Two Strings

    https://leetcode.com/problems/minimum-ascii-delete-sum-for-two-strings/ 给定两个string s1,s2,从s1和s2中删除一些 ...

  3. loadrunner 响应时间和TPS

    例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车 1.请问1秒钟最多能进几辆车?    TPS=10 2.每辆车需要多长时间进行响应?    reponse time = 1 3.改成20辆车 ...

  4. MFCEditBox如何自动换行

    设置该EditBox属性: 1.Auto HScroll             False 2.OEM Convert           False 3.Want Return           ...

  5. JavaSE-12 面向对象程序设计的几条基础原则

    摘取代码中变化的行为,形成接口 在设计基类的时候,如果该类某个成员方法在子类中的实现变化差别比较大(一部分子类实现该方法是相同的),作为基类有两个问题:一是该方法不再通用:二是子类如果重写该方法,存在 ...

  6. babun

    ‎ Table of Contents 1. 环境 2. 检查/更新 3. 包管理 4. 版本管理 Git 4.1. 设置姓名邮箱(全局方式) 4.2. 添加 SSH 4.3. 链接测试 4.4. 权 ...

  7. 记录一次通过命令行方式来使用svn碰到的一系列问题

    由于使用Xcode自带的svn管理碰到很多问题,搞得头昏脑胀,找资料时看到小码哥这方面的视频,看完就开始折腾了. 准备:1.远程仓库地址及授权账号(用户名和密码) 2.一份项目代码,之所以要有这份代码 ...

  8. POJ 1664 放苹果( 递推关系 )

    链接:传送门 思路:苹果m个,盘子n个.假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法. 根据 n 和 m 的关系可以进一步分析: 特殊的 n = 1 || ...

  9. 笔试算法题(52):简介 - KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm)

    议题:KMP算法(D.E. Knuth, J.H. Morris, V.R. Pratt Algorithm) 分析: KMP算法用于在一个主串中找出特定的字符或者模式串.现在假设主串为长度n的数组T ...

  10. 利用Merge into 改写Update SQL 一例

    前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...