Hibernate的简介及工作原理

本文介绍了Hibernate数据库持久化框架的基本概念,并深入探讨了其Session的工作原理,包括如何建立对象与数据库之间的映射,以及如何通过HQL进行数据查询。通过对Hibernate的学习,读者将能更好地理解和应用该框架进行数据库操作。
摘要由CSDN通过智能技术生成

Hibernate

Hibernate简介
Hibernate是一个ORM框架,突出特点就是强大、难学、开发迅速,适合开发中小型的、没有复杂关联关系的、业务
逻辑相对固定的项目。
Hibernate 四个核心部分:持久化操作、关联关系管理、Hibernate查询语言和二级缓存。

Hibernate持久化操作
Hibernate可以把对实体对象的操作转化为对数据库的操作。比如调用session.save(entity)时,Hibernate内部
会自动生成并执行insert语句来把数据保存到数据库。

主配置文件
主配置文件用来指定Hibernate全局参数,以及加载实体类的映射文件,习惯命名为hibernate.cfg.xml
由于不同数据库支持的SQL语句在细节上有差别,Hibernate在生成SQL语句时就要参照具体的数据库细节,这称为
数据库方言。虽然Hibernate能够识别底层所用数据库,但数据库会有多个版本,Hibernate默认选择的方言版本可
能不是我们想要的,所以最好自己指定数据库方言。
至于数据库连接池,Hibernate和Spring整合时会交给Spring管理,就不再单独配置,这样的话使用的是
Hibernate内置的数据库连接池(不可在生产环境中使用)。

映射文件
Hibernate的ORM映射包含很多方面,其中一些需要在映射文件中进行配置,比如:
类——表,表现在类名和表名相对应
字段——列,表现在字段名和列名相对应
对象——行,表现在OID和主键相对应

在Hibernate中用来唯一标志实体对象的字段称为OID,一般使用id字段作为OID,Hibernate使用OID判断两个实体
对象是否对应同一行数据。

映射文件习惯上命名为:类名.hbm.xml,DTD约束文件在org.hibernate包下
<class>用来映射类和表
<id>用来映射OID和主键列
<generator>用来指定主键生成策略
主键生成策略                    适用类型                            说明
identify                       int、long              使用自动递增主键生成主键值,比如MySQL
sequence                       int、long              使用序列生成主键值,比如oracle
native                         int、long              根据数据库自动选择identity或者sequence
uuid                           String                 由Hibernate生成UUID主键值
increment                      int、long              由Hibernate生成递增主键值
assigned                       String、int、long      由开发人员自己生成主键值

<property>用来映射字段和列,至于字段类型和列类型,Hibernate一般都能正确判断,但对于Date类型的字段最
好使用type属性指定想要的列类型,如date、time、datetime。

核心API
Hibernate有两个核心类:SessionFactory和Session。

SessionFactory
SessionFactory用来创建Session,一个SessionFactory对象对应一个数据库,如果项目中需要访问多个数据库,
就需要配置、创建多个SessionFactory。
项目中一般把SessionFactory配置成spring的bean,由spring创建、管理,所以学习阶段创建SessionFactory
的代码无需记忆,直接copy即可。
创建SessionFactory时会加载并解析主配置文件和映射文件,而且这个时候很多常用SQL语句已经生成。

Session
Session表示和数据库的一次会话、一次连接,内部封装了java.sql.Connection。
Session提供了save()get()、update()delete()等方法,以便对实体对象进行持久化操作,session进行持
久化操作需要依赖其内部的持久化上下文,也可以简单的认为session就是持久化上下文。
在项目中,由于事务会交给Spring管理,Spring可以根据配置正确的给持久化操作提供事务支持,所以项目中一般
不需要手动编写事务代码。
说明:为了简化书写,后面的entity都表示实体对象

Session工作原理:
实体对象状态转换图
持久化上下文结构图

实体对象状态 是相对于session来说的,如果session不存在或者已经关闭,实体对象状态也就没有意义。而且实体
对象状态是相对于单个session来说的,一个实体对象在sessionA中的状态和在sessionB中的状态没有任何关系。

瞬时状态 实体对象和当前session没有任何联系(session没有持有实体对象的引用)。
托管状态 一级缓存和档案区中都包含该实体对象的引用,并且档案区中该实体对象的状态标记为MANAGED。
被删除状态 一级缓存和档案区中都包含该实体对象的引用,并且档案区中该实体对象的状态标记为DELETED。

一级缓存 每个session都有自己的一级缓存,存放处于托管状态或者被删除状态的entity的引用,主要是方便持久
化操作时Hibernate内部查找entity。一级缓存的生命周期只和session有关,session创建时创建,session关闭
时关闭,和事务没有关系。一个session在提交上一个事务后可以再开启新事务,这些事务共享同一个一级缓存。

保存
session.save(entity) 执行保存操作,最终就是执行insert语句向表中插入数据
具体执行过程为:
1 立即执行对应的ins
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值