hibernate关系映射总结
hibernate的基本用法

hibernate的基本用法Hibernate是一个开源的Java框架,用于简化数据库操作。
它为开发人员提供了一个更加简单、直观的方式来管理数据库,同时也提高了应用程序的性能和可维护性。
本文将逐步介绍Hibernate的基本用法,包括配置、实体映射、数据操作等。
一、配置Hibernate1. 下载和安装Hibernate:首先,我们需要下载Hibernate的压缩包并解压。
然后将解压后的文件夹添加到Java项目的构建路径中。
2. 创建Hibernate配置文件:在解压后的文件夹中,可以找到一个名为"hibernate.cfg.xml"的文件。
这是Hibernate的主要配置文件,我们需要在其中指定数据库连接信息和其他相关配置。
3. 配置数据库连接:在"hibernate.cfg.xml"文件中,我们可以添加一个名为"hibernate.connection.url"的属性,用于指定数据库的连接URL。
除此之外,还需要指定数据库的用户名和密码等信息。
4. 配置实体映射:Hibernate使用对象关系映射(ORM)来将Java类映射到数据库表。
我们需要在配置文件中使用"mapping"元素来指定实体类的映射文件。
这个映射文件描述了实体类与数据库表之间的对应关系。
二、实体映射1. 创建实体类:我们需要创建一个Java类,用于表示数据库中的一行数据。
这个类的字段通常与数据库表的列对应。
同时,我们可以使用Hibernate提供的注解或XML文件来配置实体的映射关系。
2. 创建映射文件:可以根据个人喜好选择使用注解还是XML文件来配置实体类的映射关系。
如果使用XML文件,需要创建一个与实体类同名的XML文件,并在其中定义实体类与数据库表之间的映射关系。
3. 配置实体映射:在配置文件中,我们需要使用"mapping"元素来指定实体类的映射文件。
对象/关系映射与Hibernate框架的应用研究

以下将讨 论的是 : 对象 / 映射 中类 映射 到数 据表 的几 个 策 略 . 出了利 用 对象 / 系 映射框 架 HDr 关系 提 关 ieo
ht 来 实现对象 的持久 化 , 而节约开 发 时间和开 发成本 . a e 从
2 对象/ 关系映射 中类映射到数据表 的几个策略
一
般 来说 , 象/ 系映射 应遵循 下述原 则 :1 对 关 ()对象 有唯 一 的标 识 , 这个 标识必 须被 持久化并 作为 表 的
维普资讯
2 0 年 9月 07
韶 关学 院学报 ・自然科 学
J u l f h o u n Unv ri o ma a g a iest oS y・N trl ce c au a S in e
S p. 0 7 e 20 Vo . No. 128 9
一
张表存 储 , 只须将父 类 的属性 及子类 的扩展 属性 一一
图 3 类 及 其 继 承 关 系
Ta e bl na e a m ddr S s u i SS eS al aton N t ype
映射 为 表 中 的 列 , 在 数 据 库 表 中 增 加 一 个 识 别 列 并
图 1 一 个 类 映 射 到 一个 数 据 库 表
收 稿 日期 :07 7 o 20 —0 —3
作者简介 : 廖福保( 一 , , 1 9 ) 江西宁都人 , 男 广东农工商职业技术学院计算机科学系讲师, 硕士研究生 , 主要从事计算机应用与软件开发
维普资讯
t e 用 以标 志不 同的类 ( 图 4所示 ) 这种 方法 的优点 y , p 如 .
1 对 象/ 系映射 关
使 用面 向对象 的语 言访 问关 系数据 库 时 , 个 必须 处 理 的 问题 是 : 一 如何 将 应 用 系统 对 象模 型 映射 到关
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了

在many一方删除数据1
• 删除“五四大道”
inverse设为true,由many一方删除 从one一方去“删除”, Hibernate只是执行了 问题出在配置文件上 update语句。还是未删 没有配置set节点的inverse属性 除成功! 根本没有执行 Delete语句,数据 没有被删除!
– 配置Hibernate多对多关联,实现某OA系统项 目和人员对照关系的管理
本章目标
• 掌握单向many-to-one关联 • 掌握双向one-to-many关联 • 掌握many-to-many关联
实体间的关联
• 单向多对一
tblJd.getQx().getQxname();
• 单向一对多
TblJd jd = (TblJd)tblQx.getJds().get(0); jd.getJdname(); tblQx.getJds.add(jd);
小结
• 在租房系统中,房屋信息(Fwxx)与用户 (User)间也是多对一关系。如何配置映 射文件,使之可以通过下面的代码输出房 屋信息和发布该信息的用户名称? Fwxx fwxx = (Fwxx)super.get(Fwxx.class,1);
System.out.println( fwxx.getTitle() + "," + fwxx.getUser.getUname());
inverse是“反转”的意思,表示关联关系的控制权。 为true,表示由对方负责关联关系的添加和删除; 执行了delete语句, 为false,表示由自己负责维护关联关系。 删除成功
• 在many一方删除数据的正确做法:
Hibernate中关联关系映射策略研究与实现

业务逻辑层
l 接收表示层提交的表单数据, 进行相应的业务逻辑处理 l I处理通过持久层取得的原始数据,结果再送入持久层处理 I l 将业务逻辑层处理的结果反馈给表示层
业务逻辑层 持久层打交道
’
进一步提高软件开发 的效率以及 降低软件开发的难 度, 基于 We b的应 用 通 常 采用 四层 式 的软件 开发 框 架, 分层降低了系统各部分之间的耦合程度 , 增加了 系统 的可 维护 性和可 扩展 性L 。 2 ]
l 概
述
随着计算机软件开发技术 的快速发展 , b应 We 用程 序 的体 系结 构也 由单层 向两层 、 三层甚 至更 多层 次 的方 向发展 , e 用 程 序 通 常 涉 及 到 对 大 型 数 W b应 据库 的访 问操作 。两 层 的开 发模 型实 现 了应 用层 与 数 据 层 的分 离 , 应用 层 包括 用 户 界 面 、 务逻 辑 和数 业 据持久 化等 功 能 , 据层用 于保存 需要 进行 持久 化 的 数 数 据 。两层 模 型 中, 业务 逻 辑 、 据 持 久化 以及 用 将 数 户界 面都集 中在 应用 层 , 得 应 用 层 过 于臃 肿 , 使 因此 提 出了三层 的软 件开 发架构 。三 层架 构 中 , 应用 层划 分为 表示层 和业 务 逻 辑层 , 就 是 通 常所 说 的 MVC 这 ( dl Mo e—Vi e w—C n rl模 型 一视 图 一 控 制 ) 式 o to, 模 的系统 开发 架构 , MVC 模 式 的 广 泛 应 用 , 生 了 催 MVC框架 _ 。三层 模 型 虽 然 实 现 了业 务 逻 辑 和 用 1 ]
Hient brae的配 置 文 件 可 以使 用 hb raecg ient. f.
Hibernate总结PPT教学课件

1、即时加载 lazy=“false”; 2、延迟加载 lazy=“ture”; 特点:在需要使用时对数据进行加载,节约资源
HQL联表查询中fetch的使用 本地SQL查询
1、在实体映射文件中编写
2、在项目中进行调用
2020/12/11
9
第5章:Criteria查询
Hibernate学习总结
2020/12/11
1
第1章: Hibernate入门
数据持久化ORM 在项目中使用Hibernate
2020/12/11
2
数据持久化ORM
ORM(Object Relationship Mapping)
内存
Hibernate 项目
ORM
数据库
2020/12/11
3
2020/12/11
6
第3章: HQL实用技术
使用HQL语句的步骤:
1、得到Session 2、编写HQL语句 3、创建Query对象 4、执行查询
HQL中占位符的使用
1、使用‘?’占位符 为占位符设值 eq: query. setType(index,value); index从0开始 2、命名参数占位符 “:”后面必须为实体类的属性 设置值: QueryProperities qp = new QueryProperities();
Criteria查询
原理:根据实体类的类型进行查询 Criteria查询时条件设置:使用add()方法 1、 使用Restriction
Restriction. le(“实体类对象属性”,值) //小于 Restriction. ge(“实体类对象属性”,值) //大于 2、使用Example(将对象中不为空的属性作为条件) 将条件封装到实体对象,在使用该对象查询 Example. create(实体类对象);
hibernate最精细总结 java

Hibernate总结注:重点讲解关联映射总结人:张焕邮箱:zhang343489603@欢迎交流讨论。
目录1)核心接口简介2)Hibernate版本更新情况3)Hibernate关联映射4)简单属性查询5)Hibernate与延迟加载6)hibernate 中Criteria 的使用介绍7) Hibernate程序性能优化Hibernate优点:1、封装了jdbc,简化了很多重复性代码。
2、简化了DAO层编码工作,使开发更对象化了。
3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。
4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。
所以说它是一个轻量级框架。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web 应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。
1)核心接口简介:Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。
这6个核心接口在任何开发中都会用到。
通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。
下面对这6个核心接口分别加以介绍。
Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。
)。
但需要注意的是Session对象是非线程安全的。
同时,Hibernate的session不同于JSP应用中的HttpSession。
13-Hibernate关联关系映射:一对多孤儿删除

13-Hibernate关联关系映射:⼀对多孤⼉删除persist和merge是JPA提供的内容none是不使⽤级联,save-update是保存和更新的时候级联hibernate级联的取值none:不使⽤级联save-update:保存和更新时级联delete:删除的时候级联all:delete-orphan:孤⼉删除,孤⼦删除*仅限于⼀对多,只有⼀对多的时候才有类似⽗⼦关系的存在,才有⽗⼦表的存在。
认为⼀的⼀⽅是⽗⽅。
因为⼀个⽗亲是可以有多个孩⼦的。
多的⼀⽅是⼦的⼀⽅。
*当⼀个客户与某个订单解除关系,其实就是将外键置为null,如果你的订单没有所属的客户,那你的订单还有意义吗?订单没有了所属客户,就相当于⼀个孩⼦没有了⽗亲,将这种记录就删除了,这就叫做孤⼉删除。
*但是这只有在⼀对多的情况下才存在。
多对多的情况哪有这种关系,多对多就是多个⽗亲多个⼉⼦,这就不合理了。
⼀的⼀⽅是⽗⽅,多的⼀⽅是⼦⽅。
All-delete-orphan:我们现在想让1号客户和1号订单解除关系:⼀个部门可以有多个员⼯,⼀个员⼯只能属于⼀个部门。
解除关系就是把外键置为空了,就是把外键置为null了。
Hibernate:selectcustomer0_.cid as cid0_0_,customer0_.cname as cname0_0_fromcustomer customer0_wherecustomer0_.cid=?Hibernate:selectorder0_.oid as oid1_0_,order0_.addr as addr1_0_,order0_.cno as cno1_0_fromorders order0_whereorder0_.oid=?Hibernate:selectorders0_.cno as cno0_1_,orders0_.oid as oid1_,orders0_.oid as oid1_0_,orders0_.addr as addr1_0_,orders0_.cno as cno1_0_fromorders orders0_whereorders0_.cno=?Hibernate:updateorderssetcno=nullwherecno=?这个时候我们再看客户和订单都还在。
一对多,多对一关系映射

⼀对多,多对⼀关系映射 ⼀对多,多对⼀关系映射 现实⽣活中有很多1对多(多对1)的关系模型。
⽐如,⼀个⼈可以有0到多套房⼦,0到多辆汽车;⼀个⽗亲有0到多个孩⼦等等。
这种关系被称作1对多关系。
反过来,房⼦与⼈,汽车与⼈的关系,以及孩⼦与⽗亲的关系就是多对⼀的关系。
这⾥需要注意⼀点的是,多对⼀关系的⼀个前提是:⼀套确定的房⼦只能属于某个确定的⼈(不能属于多⼈);⼀个确定的孩⼦也只能属于某个确定的⽗亲。
下⾯我们就拿最简单的⽗亲和孩⼦的关系来说明1对多(多对1)模型的映射。
关系模型:⽗亲 vs 孩⼦(Father vs Son)。
关系映射:one-to-many反过来,关系模型:孩⼦ vs ⽗亲(Son vs Father)。
关系映射:many-to-one 很多初学者往往有这样的疑问,我什么时候需要定义映射关系呢? 答案很简单:按需求来确定。
就是说你需要哪种关系的时候就定义哪种映射,不需要的时候就可以不定义它们的关系映射了。
还是以上⾯的例⼦来说明。
如果你需要在取得孩⼦(Son)的时候,同时需要知道该孩⼦的⽗亲(Father)是谁,你就可以在孩⼦的实体类⾥定义孩⼦跟⽗亲的关系映射: @ManyToOne 。
同样,如果需要知道某⽗亲的所有孩⼦,就可以在⽗亲的实体类⾥定义⽗亲跟孩⼦的关系映射: @OneToMany 。
1.ManyToOne(多对⼀) 单向:不产⽣中间表,但可以⽤@Joincolumn(name=" ")来指定⽣成外键的名字,外键在多的⼀⽅表中产⽣!2.OneToMany(⼀对多) 单向:会产⽣中间表,此时可以⽤@onetoMany @Joincolumn(name=" ")避免产⽣中间表,并且指定了外键的名字(别看 @joincolumn在⼀中写着,但它存在在多的那个表中)3.OneToMany ,ManyToOne 双向( 两个注解⼀起⽤的):如果不在 @OneToMany 中加mappedy属性就会产⽣中间表,此时通常在 @ManyToOne 的注解下再添上注解 @Joincolumn(name=" ") 来指定外键的名字(说明:多的⼀⽅为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新外键记录)!( @OneToMany(mappedBy="⼀对多中,多中⼀的属性") 出现mapby为被维护端|||默认为延迟加载)⽤例:1 @ManyToOne(fetch=ZY)2 @JoinColumn(name="child_id")3private OrderChild orderChild;45 @OneToMany(mappedBy="orderChild",fetch=ZY,cascade={CascadeType.MERGE})6 @NotFound(action=NotFoundAction.IGNORE)//代表可以为空,允许为null7private List<OrderChildGoods> goodsList; hibernate中@ManyToOne默认是⽴即加载,@OneToMany默认是懒加载但是如果加上了@NotFound之后设置的fetch=ZY是不起作⽤的,也就是设置@NotFound后变为了⽴即加载eager 下⾯举例详细说明⼀下@ManyToOne @ManyToOne注解的这端,是多端 1.在注释@ManyToOne(cascade=CascadeType.REFRESH,optional=true)中将属性optional设置为true,这可以使得即使外键为空时仍可以向表中添加数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.2.2.3、一对一主键关系映射(非延迟抓取) 配置 1(UserModel.hbm.xml) Java 代码 1. <one-to-one name="userGeneral" cascade="all"/>
配置 2(UserGeneralModel.hbm.xml) Java 代码 1. 2. 3. 4. 5. 6. 7. 8. 关联的对象所对应的数据库表之间,通过一个外键引用对主键进行约束。 <id name="uuid"> <generator class="foreign"> <param name="property">user</param> </generator> </id> <one-to-one name="user" class="erModel"/>
四、如何把数据库关系表示为面向对象中的关系: 1、关联:将数据库表之间的关系转化为对象之间的关系;在 Hibernate 中总指实体之间的关系。 2、映射:完成 java 对象到数据库表的双向转换。 3、级联(可选):将数据库中的级联转化为对象中的级联(两者(对象和数据库表)没关系)。 4、Hibernate 的表和对象的映射: 1、实体类型映射: 4.1.1、主键之间的映射
5.2.2、实体关联关系映射: 5.2.2.1、单向关联关系映射,不演示。 5.2.2.2、双向关联关系映射
Java 代码 1. 2. 3. 4. 5. 6. 单向 定义:不知道另一端什么情况,获取一端另一端自动获取,因为单向,你不知道另一侧是什么。 如 class A{ B b;} class B{ } 只能从 A 导航到 B,不能从 B 导航到 A 关系维护:另一端维护,如 B 维护
1 / 15
4.1.2、类属性与表字段的映射 4.1.3、组件映射 4.1.4、集合映射 2、实体关联关系映射: 4.2.1、关联关系映射
五、Hibernate 映射示例: 5.1、实现 5.1.1、数据库表定义(主表) 5.1.1.1、用户表 Java 代码 1. 2. 3. 4. 5. 6. 7. 8. CREATE TABLE TBL_USER ( UUID NUMBER(10) NOT NULL, NAME VARCHAR2(100), AGE NUMBER(10) NOT NULL, PROVINCE VARCHAR2(100), CITY VARCHAR2(100), STREET VARCHAR2(100), CONSTRAINT PK_USER PRIMARY KEY(UUID));
5 / 15
7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
双向 定义:知道另一端(两个单向),从一端获取另一端,从另一端也能获取一端 如 class A{ B b;} class B{ A a;} 只能从 A 导航到 B,也能从 B 导航到 A 关系维护:两端,对关联的一侧所作的改变,会立即影响到另一侧 关联的多样性: 从一侧看是多对一,从另一侧看是一对多 另外还有一对一、多对多 EJB CMP:天生双向,对关联的一侧所作的改变,会立即影响到另一侧, 如 userGeneral.set(user),则自动调用 user.setUserGeneral(userGeneral) Hibernate、JPA:天生单向,两侧关系的维护是不同的关联,必须手工维护 如 userGeneral.set(user),则需要手工调用 user.setUserGeneral(userGeneral)。
5.1.1.3、农场表(一个用户有多个农场) Java 代码 1. 2. 3. 4. 5. CREATE TABLE TBL_FARM ( UUID NUMBER(10) NOT NULL, NAME VARCHAR2(10), FK_USER_ID NUMBER(10), CONSTRAINT PK_FARM PRIMARY KEY(UUID), 2 / 15
Java 代码 1. private Map<Integer, String> farmMap = new HashMap<Integer, String>();
Java 代码 1. 2. 3. 4. 5. <map name="farmMap" table="TBL_FARM"> <key column="fk_user_id"/> <map-key type="int" column="uuid"/> <element type="string" column="name"></element> </map> 对于集合类型默认是延迟加载的,且只能单向导航,不能双向。
5.1.2.4、农场 Model Java 代码
3 / 15
1. 2. 3. 4. 5. 6.
package com.bjpowernode.h3test.model; public class FarmModel implements java.io.Serializable { private int uuid; private String name;//农场的名称 private UserModel user;//所属用户 }
hibernate 关系映射总结
一、概念: 关系:名词,事物之间相互作用、相互联系的状态。 关联:名词:表示对象(数据库表)之间的关系;动词:将对象(数据库表)之间通过某种方式联系起来。 映射:将一种形式转化为另一种形式,包括关系。 级联:动词,有关系的双方中操作一方,另一方也将采取一些动作。
值类型:对象不具备数据库同一性,属于一个实体实例其持久化状态被嵌入到所拥有的实体的表行中,没有标识符。 实体类型:具有数据库标识符。
5.2、配置 5.2.1、实体类型映射: 5.2.1.1、主键的映射(UserModel.hbm.xml) Java 代码 1. 2. 3. 4. 5. <id name="uuid"> <generator class="sequence"> <param name="sequence">user_uuid</param> </generator> </id>
5.1.1.2、用户普通信息表(一个用户有一个资料) Java 代码 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. CREATE TABLE TBL_USER_GENERAL ( UUID NUMBER(10) NOT NULL, REALNAME VARCHAR2(10), GENDER VARCHAR2(10), BIRTHDAY NUMBER(10), HEIGHT NUMBER(10), WEIGHT NUMBER(10) , CONSTRAINT PK_USER_GENERAL PRIMARY KEY(UUID), CONSTRAINT FK_USER_GENERAL FOREIGN KEY(UUID) REFERENCES TBL_USER(UUID));
5.2.1.4、集合映射(Set、List、Map) (都是通过外键连接的,,,默认延迟抓取) Set: Java 代码 1. private Set<String> farmSet = new HashSet<String>();
Java 代码 1. 2. 3. 4. <set name="farmSet" table="TBL_FARM" > <key column="fk_user_id"/><!—该外键是 tbl_farm 的--> <element type="string" column="name"/> </set> 4 / 15
5.2.1.2、类属性与表字段的映射(UserModel.hbm.xml) Java 代码 1. <property name="name"/>
5.2.1.3、组件映射(UserModel.hbm.xml) Java 代码 1. 2. 3. 4. 5. <component name="address" class="com.bjpowernode.h3test.model.AddressModel"> <property name="province"/> <property name="city"/> <property name="street"/> </component>
Java 代码 1. private List<String> farmList = new ArrayList<String>();
Java 代码 1. 2. 3. 4. 5. <list name="farmList" table="TBL_FARM"> <key column="fk_user_id"/> <list-index column="uuid"></list-index> <element type="string" column="name"/> </list>