【Hibernate学习】 ——ORM(一)
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(一)的更多相关文章
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate学习总汇
Hibernate的基础知识 什么是框架? 什么是Hibernate框架? |--1.应用在javaee三层结构中的dao层 |--2.在dao层里面做对数据库进行crud操作,使用hibernate ...
- Hibernate学习笔记一 使用idea开发工具搭建框架
1.导包,包下载地址:http://hibernate.org/orm/downloads/ 2.创建数据库,准备表,实体.示例: CREATE TABLE `cst_customer` ( `cus ...
- hibernate学习(1)
对象的持久化 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中 广义的理解,“持久化”包括和数据库相关的各种操作 -保存:把对象永久保存到数据库中 -更新:更新数据库中对象的状态 -删除:从数据库 ...
- hibernate学习-HibernateDemo
上篇文章我们讲述了eclipse安装hibernate插件的过程,这篇文章我们来做第一个HibernateDemo. 1).hibernate的jar开发包的下载,官网下载地址:http://hibe ...
- Hibernate学习之——搭建log4j日志环境
昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习总结
首先声明这是个坑爹的框架 属于ssh经典框架中的持久层框架,说白了就是管理数据库的. 下载地址:http://hibernate.org/orm/ 这里写了版本5.2,下载下来的基本不怎么会用,因为文 ...
随机推荐
- OJB
OJB 编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 对象关系桥(OJB)是一种对象关系映射工具,它能够完成从Java对象到关系数据库的透明存储. 英文名 OJB ...
- 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中删除一些 ...
- loadrunner 响应时间和TPS
例子:一个高速路有10个入口,每个入口每秒钟只能进1辆车 1.请问1秒钟最多能进几辆车? TPS=10 2.每辆车需要多长时间进行响应? reponse time = 1 3.改成20辆车 ...
- MFCEditBox如何自动换行
设置该EditBox属性: 1.Auto HScroll False 2.OEM Convert False 3.Want Return ...
- JavaSE-12 面向对象程序设计的几条基础原则
摘取代码中变化的行为,形成接口 在设计基类的时候,如果该类某个成员方法在子类中的实现变化差别比较大(一部分子类实现该方法是相同的),作为基类有两个问题:一是该方法不再通用:二是子类如果重写该方法,存在 ...
- babun
Table of Contents 1. 环境 2. 检查/更新 3. 包管理 4. 版本管理 Git 4.1. 设置姓名邮箱(全局方式) 4.2. 添加 SSH 4.3. 链接测试 4.4. 权 ...
- 记录一次通过命令行方式来使用svn碰到的一系列问题
由于使用Xcode自带的svn管理碰到很多问题,搞得头昏脑胀,找资料时看到小码哥这方面的视频,看完就开始折腾了. 准备:1.远程仓库地址及授权账号(用户名和密码) 2.一份项目代码,之所以要有这份代码 ...
- POJ 1664 放苹果( 递推关系 )
链接:传送门 思路:苹果m个,盘子n个.假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法. 根据 n 和 m 的关系可以进一步分析: 特殊的 n = 1 || ...
- 笔试算法题(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 ...
- 利用Merge into 改写Update SQL 一例
前言 客户说,生产系统最近CPU使用率经常达到100%,请DBA帮忙调查一下. 根据客户提供的情况描述及对应时间段,我导出AWR,发现如下问题: 11v41vaj06pjd :每次执行消耗2,378, ...