Hibernate核心组件详解
Hibernate是对象/关系映射(ORM,Object/Relational Mapping)的解决方案,就是将Java对象与对象关系映射到关系型数据库中的表格与表格之间的关系。它是Java应用与关系数据库之间的桥梁,负责Java对象和关系数据之间的映射。Hibernate内部封装了通过JDBC访问数据库的操作,向上层应用提供了面向对象的数据库访问API。
Hibernate的体系结构
Hibernate通过配置文件( hibernate.cfg.xml )和映射文件( *.hbm.xml )把Java对象或持久化对象( Persistent Object,PO )映射到数据库的表格,然后通过操作PO,对数据表中的数据进行增、删、改、查等操作。

Hibernate的核心组件
1、Hibernate配置文件(hibernate.cfg.xml):
主要用来配置数据库连接参数,如数据库驱动程序、URL、用户名、密码等。hibernate.cfg.xml还在其<mapping>子元素中定义用到的xxx.hbm.xml映射文件列表
2、映射文件(xxx.hbm.xml):
用来把PO与数据库中的数据表、PO之间的关系与数据库之间的关系、以及PO的属性与表字段一一映射起来,是Hibernate的核心文件
每个PO类对应一个映射文件,和该PO类在同一个目录下
3、Configuration类:
用来读取Hibernate配置文件,并生成SessionFactory对象。
负责管理Hibernate配置信息。执行Configuration conf=new Configuration().configure()语句时,Hibernate自动在CLASSPATH中搜寻Hibernate配置文件;在Java Web应用中,则在WEB-INF/classes目录下搜寻配置文件。还可以指定配置文件的位置,如:
File file=new File("C:\\Users\\Administrator\\Desktop\\dfd\\Hibernate_Proj\\src\\hibernate.cfg.xml");
Configuration cfg=new Configuration().configure(file);
4、SessionFactory接口:
产生Session实例的工厂,负责Session实例的创建,可通过Configuration创建SessionFactory
Configuration cfg=new Configuration().configure();
SessionFactory sf=cfg.buildSessionFactory();
SessionFactory线程安全,可以被多线程调用以取得Session
5、Session接口:
用来操作持久化对象PO。有get()、load()、save()、update()、delete()等方法用来对PO进行加载、保存、更新及删除等操作,是Hibernate的核心接口
是应用程序与数据库之间的一个会话,是Hibernate运作中心,相当于JDBC中的Connection。通过SessionFactory创建
6、Query接口:
Query负责执行各种数据库查询。它可以使用HQL语言对PO进行查询操作。Query对象可以使用Session的createQuery()方法生成
(1)setXxx ( ):用于设置HQL中问号或变量的值
(2)list ( ):返回查询结果,并把查询结果转换成List对象
(3)excuteUpdate ( ):执行批量更新或批量删除语句
7、Transaction接口:
用来管理Hibernate事务,主要方法有commit()和rollback(),可从Session的beginTransaction()方法生成
8、持久化对象(PO):
一个持久化类就是普通的JavaBean,但是它与Session关联起来后,就具有了持久化的能力。每一个数据表对应一个持久化对象(PO),PO可以看成是与数据库表相映射的Java对象,PO类中不应该包含任何对数据的操作,唯一特殊的是他们与Session相关联。
PO对象在Hibernate中存在三种状态:
(1)临时状态(transient):
由new命令开辟内存空间刚生成的Java对象就处于临时态。临时对象在内存中是孤立存在的,不和数据库的数据有任何关联关系。在Hibernate中,可通过Session的save()或saveOrUpdate()方法将临时对象与数据库相关联,并将数据插入到数据库中,此时转变成持久化对象。
(2)持久状态(persistent):
处于持久态的对象也称为PO,处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识。如果使用Hibernate的delete()方法,对应的持久对象就变成临时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联。
当一个Session执行close()或clear()之后,持久对象变成脱管对象。
持久对象的特点:和Session实例关联、在数据库中有与之关联的记录。
(3)脱管状态(detached):
当与某持久对象关联的Session被关闭后,该持久对象转变为脱管对象。当脱管对象被重新关联到Session上时,将再次转变成持久对象。
脱管对象拥有数据库的标识值,可通过update()、saveOrUpdate()等方法,转变成持久对象
save()、update()、saveOrUpdate()的区别:
save():的作用是保存一个新的临时对象到数据库,变成持久对象;
update():可以把一个脱管状态的对象(一定要和一个记录对应)更新到数据库,变成持久对象
saveOrUpdate():合并了save()和update(),因为有时候不知道一个对象是临时对象还是脱管对象,saveOrUpdate()首先判断该对象是临时还是脱管对象,再调用合适的方法。
Hibernate的运行过程
(1) 应用程序调用Configuration类,该类读取Hibernate配置文件级映射文件中的信息,并生成一个SessionFactory
(2) 从SessionFactory对象生成一个Session对象,并用Session对象生成Transaction对象
(3) 通过Session对象的get()、load()、save()、update()、delete()、saveOrUpdate()等方法对PO进行加载、保存、更新、删除等操作;通过Session对象生成一个Query对象,进行查询操作
(4) 如无异常,Transaction对象将提交这些操作结果到数据库中

参考书籍:Java Web技术整合应用与项目实战(张志峰等编著)
参考:Java Web编程的主要组件技术——Hibernate核心组件
Hibernate核心组件详解的更多相关文章
- hibernate Expression详解
关键字: hibernate expression hibernate Expression详解Expression.gt:对应SQL条件中的"field > value " ...
- ansible安装与核心组件详解
第1章 安装anisble 1.1 安装epel源 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarc ...
- Java程序员从笨鸟到菜鸟之(五十一)细谈Hibernate(二)开发第一个hibernate基本详解
在上篇博客中,我们介绍了<hibernate基本概念和体系结构>,也对hibernate框架有了一个初步的了解,本文我将向大家简单介绍Hibernate的核心API调用库,并讲解一下它的基 ...
- Hibernate配置文件详解
Hibernate配置方式 Hibernate给人的感受是灵活的,要达到同一个目的,我们可以使用几种不同的办法.就拿Hibernate配置来说,常用的有如下三种方式,任选其一. 在 hibernate ...
- (转)spring hibernate properties详解
转载地址:http://blog.sina.com.cn/s/blog_692d0a650100xyqx.html Hibernate配置属性 hibernate.dialect:一个Hibernat ...
- Maven搭建SpringMVC+Hibernate项目详解 【转】
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- Hibernate入门详解
学习Hibernate ,我们首先要知道为什么要学习它?它有什么好处?也就是我们为什么要学习框架技术? 还要知道 什么是Hibernate? 为什么要使用Hibernate? Hib ...
- Maven搭建SpringMVC+Hibernate项目详解
前言 今天复习一下SpringMVC+Hibernate的搭建,本来想着将Spring-Security权限控制框架也映入其中的,但是发现内容太多了,Spring-Security的就留在下一篇吧,这 ...
- Hibernate 配置详解(3)
7) hibernate.max_fetch_depth: 该属性用于设置left out join单对象查询关系(one-to-one/many-to-one)中最大的关联深度.默认值为0,即默认情 ...
随机推荐
- Python3基础 str find+index 是否存在指定字符串,有则返回第一个索引值
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Git基础 —— Github 的使用
Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Github 的利用 Gith ...
- Stream API
引例: 1 List<String> strList = Arrays.asList("zhaojigang","nana","tiany ...
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 题意: 思路:这道题目是最小割题目,但是吧你直接套用Dinic是会超时的. 这里有种很奇妙的做 ...
- UVa 127 纸牌游戏(栈)
https://vjudge.net/problem/UVA-127 题意: 按从左至右的顺序发牌,并摆成一行,发牌不要相互重叠.游戏中一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数 ...
- 非[无]root权限 服务器 下安装perl以及perl模块--转载
转载自http://www.zilhua.com 在本博客中,所有的软件安装都在服务器上,且无root权限.理论上适合所有的用户. 我的安装目录 cd /home/zilhua/software 1. ...
- bam/sam格式说明--转载
在SAM输出的结果中每一行都包括十二项通过Tab分隔,从左到右分别是: 1 序列的名字(Read的名字) 2 概括出一个合适的标记,各个数字分别代表 1 序列是一对序列中的一个 2 比 ...
- Spring AMQP 源码分析 07 - MessageListenerAdapter
### 准备 ## 目标 了解 Spring AMQP 如何用 POJO 处理消息 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListener> ## 相 ...
- VMware 怎么判断哪台机子试图用混杂模式且不成功
主要是看个log, 然后推断虚拟端口号 The VMkernel logs at /var/log/vmkernel or /var/log/messages contain entries simi ...
- String字符串存入数据库中超出最大长度(oracle varchar2 4000)?应合理分条存储(java实现-工具/方法)
问题描述 需要向数据库中保存数据,但某个字段内容长度过长(有中文.符号.英文),应该根据字符串内容与数据库存储上限合理设置储存方式. 解决思路 分条存储,即多条数据前n个字段一致,最后内容字段不同,下 ...