【Hibernate学习】 ——ORM(一)

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

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

单向一对一

主键关联

让两个对象有相同的主键值,表名它们之间的一对一关系,数据库没有额外的字段来维护它们之间的关系,仅仅通过表的主键来关联。如下图:通过两个表中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>标签不影响存储,只影响加载,故单向关联和双联关联的表结构是一样的。

唯一外键关联

表关系:

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

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(一),布布扣,bubuko.com

时间: 2024-10-12 09:21:47

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

【Hibernate学习】 ——ORM(三)

前面几种关系我们以前就经常用,对于继承我们也并不陌生,经常接触的类与类之间的继承用extends关键字,那么在表与表的关系中如何表示呢?下面我们来讲继承映射. 继承有三种实现的策略,单表继承,具体表继承,类表继承.下面来分析一下这三种方式 继承关联类关系  单表继承 每棵类继承树使用一个表,可知,这三个类在一张表中.如下表: 这张表包括了父类,子类的所有属性,通过Type来区分是哪个子类. 对象模型映射到关系模型: <classname="com.bjpowernode.hibernat.

【Hibernate学习】 ——ORM(二)

上篇博客主要介绍了一对一的关系,主要理解单向与双向的区别,主键关联与唯一外键关联的区别.下面继续介绍一对多与多对多关联. 一对多关联映射 一个班级对应多个学生 单向一对多关系 关系表: classes代码 <classname="com.bjpowernode.hibernat.Classes"table="t_classes"> <idname="id"> <generatorclass="native&

Hibernate学习笔记:第一个程序的搭建

Hibernate学习笔记:第一个程序的搭建 前一段时间对Struts2这个框架有了一点点地了解,很高兴,自己开始学习Hibernate这个框架了.本篇博文将记录下第一个Hibernate程序的搭建过程.其实有时候个人觉得无论我们学习什么语言也好,还是学习什么框架也好,第一个HelloWorld程序真的相当重要,假如 我们在学习第一个HelloWorld程序都跑不出来,这完全影响着我们对新接触的东西的兴趣和动力,但是,往往第一个程序都会涉及到很多的配置,因此使得对于初学者要摸索一定的时间,对于我

8、Hibernate框架(ORM详解、主文件配置、映射文件配置)

开发回顾: SSH框架: Struts框架, 基于mvc模式的应用层框架技术! Hibernate, 基于持久层的框架(数据访问层使用)! Spring, 创建对象处理对象的依赖关系以及框架整合! Dao代码,如何编写? - 操作XML数据 - 使用Jdbc技术 原始的jdbc操作, Connection/Statement/ResultSet 自定义一个持久层框架, 封装了dao的通用方法 DbUtils组件, 轻量级的dao的组件: Hibernate技术 [hibernate最终执行的也是

hibernate学习之持久化对象

Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置的,不能被卸载. Hibernate的二级缓存是由SessionFactory提供的,他作为一个可插入的组件使用的,默认是不支持的,应用必须明确配置二级缓存才能使用. Session缓存的作用: 降低数据库的访问频率 保证缓存中的对象与数据库中的相关记录保持同步持久化对象的状态: 临时状态(Tran

Hibernate学习笔记

一 . Hibernate的简介 提到hibernate,首先的说说ORM框架技术(Object.Relation.Mapping),它的主要问题就是对象-关系的映射,怎么说呢?现在用的数据库大多数都是关系数据库,而关系数据库重在于表与表之间的关系连接.术语就为:一个持久化类和一个表对应,类的每个实例对应表的一条记录.其他就不说了,回到hibernate.ORM框架类型有很多,hibernate就是其中的一种,还有EJB框架(Enterprise javaBean).iBATIS框架.TopLi

Hibernate学习一:Hibernate注解CascadeType

http://zy19982004.iteye.com/blog/1721846 ———————————————————————————————————————————————————————— Hibernate学习一:Hibernate注解CascadeType 博客分类: Hibernate hibernate 一.概念 现有一场景:一个管理员可以管理多个网吧,一个网吧可以被多个管理员管理.从中抽象出一个多对多的例子user-bar. 主控方user:多对多里面里面会有第三张表user_b

《Hibernate学习笔记十一》:树状结构设计

<Hibernate学习笔记十一>:树状结构设计 这是马士兵老师讲解Hibernate的一个作业题,树状结构设计,这是一个比较典型的例子,因此有必要写篇博文记录下. 树状结构的设计,它是在同一个类中使用了多对一(ManyToOne)和一对多(OneToMany). 在完成这个题目我们应该按照如下的步骤进行: 1.先思考数据库的模型应该是什么样的?? 数据库中的模型应该如下:即存在id p_id 2.思考面向对象的模型,及如何来进行映射??? 根据数据库中表的特点,对象应该有id name;由于

Hibernate学习——一般配置

mysql建表语句: create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); Employee.java package com.study; public class Employee { private