疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java核心技术Hibernate详讲


 

 
一 概述
1.JPA
 
Java Persistence API,是Java EE为ORM框架定义的规范,任何使用java语言的ORM框架都必须实现该规范。Hibernate/Mybatis都是是JPA的一种实现。
 
2.ORM
 
Object Relational Mapping,对象到关系的映射,在关系型数据库与对象之间建立映射关系,以实体对象操作关系型数据库。
 
3.持久化
 
将对数据库的操作永久地反映到数据库中的过程叫做持久化。
 
4.持久层框架
 
封装了对数据库进行持久化操作的框架叫做持久化框架。所谓框架就是在内部实现了一些常用的基本操作,提供简单的接口,缩减操作步骤,而且扩展了功能。
 
二 数据库连接池
1.背景
数据库连接是一个极其有限的宝贵资源,在Web应用程序中表现得尤为突出。Web应用访问量大,而数据库支持的并发连接数目是有限的,连接越多,速度越慢,降低了用户体验。
 
在数据库连接池产生以前,访问数据库需要先建立连接,访问结束后关闭连接,下次需要时再重复创建与关闭过程,而数据库连接的创建与关闭本身消耗大量的系统资源,这时产生了共享数据库连接的思想,数据库连接池应运而生。
 
2.数据库连接池的含义
 
数据库连接池提供与管理用于访问数据库的连接。
数据库连接池在初始化阶段会创建一定数量的数据库连接,投放到数据连接池中。
用户访问数据库时不创建连接,而是从数据库连接池中获取连接,访问完毕后,不关闭连接,而是将连接归还连接池,以实现连接的重复使用。
3.常用数据连接池
 
C3P0是一种开放源代码的JDBC连接池。
DBCP。
4.配置数据源
 
Hibernate框架推荐使用C3P0:
 
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
三 Hibernate简介
1.基本流程
 
 
 
2.Configuration
 
负责加载配置文件,启动Hibernate。配置文件的默认名称为“hibernate.cfg.xml”,放在类路径下。
 
3.SessionFactory
 
负责创建Session对象,保存了当前数据库中所有的映射关系,线程安全。重量级对象,初始化过程耗费大量的资源,因此在应用程序中应避免创建多个SessionFactory对象。
 
4.Session
 
⑴含义
 
代表应用程序与数据库的一次会话,是Hibernate中持久化操作的核心,直接负责所有的持久化操作。
⑵非线程安全
 
session对象线程不安全,应避免多个线程共享一个Session对象。多个线程共享一个session对象,可能会因为session缓存的存在出现数据泄露,或者一个线程关闭了session对象,另一个线程出现异常。
 
⑶依赖事务
 
Session只能在事务内部运行,即未开启事务,无法运行Session。
 
⑷创建
 
Session session=sessionFactory.openSession();
Session session=sessionFactory.getCurrentSession();
第一种方式不需要配置,直接使用,第二种方式必须在配置文件中配置,配置如下:
<property name="current_session_context_class">thread</property>
openSession每调用一次创建一个Session对象,getCurrentSession在同一个线程内部获得的是同一个Session对象。
第二种方式创建的对象与线程绑定,第一种未与线程绑定。第二种方式创建的对象在事务提交或者回滚后自动关闭,第一种方式创建的连接必须手动关闭。
⑸关闭
 
Session一旦被关闭,就与线程解除了绑定关系,下一次通过该线程获得的是不同的Session对象。
Session关闭以后,断开了与数据库的连接,就无法通过该Session对象访问数据库。
Session一旦关闭,就标志着应用程序与数据库的一次会话结束,再次通信需要建立新的会话。
 
5.主键生成策略
 
生成策略 含义 维护方
increment 获取数据库中当前主键的最大值,加1作为新数据的主键 Hibernate
identity 按照自增方式生成主键 数据库
native 从底层数据库支持的主键生成策略中选择 数据库
assigned 由程序员手动生成主键 程序员
sequence 基于sequence表生成主键 数据库
uuid 生成一个全球唯一的32位主键 数据库
四 持久化对象的状态
1.瞬时状态
 
对象被创建、未被Session调用时的状态,与数据库中的数据无连接,一旦被Session通过save或者saveOrUpdate调用方法转化为持久化状态。
 
2.持久化状态
 
被Session调用后、与数据库中的数据存在关联的状态。
 
3.脱管状态
 
当Session对象关闭以后,持久化对象由持久状态转化为脱管状态,持久化对象处在脱管状态下仍然与数据库中的数据存在关联,通过update或者saveOrUpdate转化为持久化状态
 
4.集合角度
 
假如把关系型数据库中的表看做一个持久化类,每一行记录都是一个该类的对象,即持久化对象,一个对象如果在集合之外,则处于瞬时状态;在集合之内并且正在被Session调用,处在持久化状态;如果Session关闭,处在脱管状态。
 
 5.内存地址
 
对象的状态发生改变时,对象在内存中的地址并未发生改变,仍然是同一对象,只是对象与数据库的关系发生改变。
 
五 持久化操作
 
1.插入数据
 
session.save(Object obj);
2查询数据
 
⑴get
 
Object obj=(Object)session.get(Object.class,Serializable id);
⑵load
 
Object obj=(Object)session.get(Object.class,Serializable id);
返回对象的代理,在对象被调用时,才向数据库发送SQL语句。
 
3.删除数据
 
Object obj=session.get(Object.class,Serializable id);
session.delete(obj);
4.修改数据
 
Object obj=session.get(Object.class,Serializable id);
obj.setter();//调用setter方法修改对象属性
5.其他方法
 
clear():清空Session缓存,取消所有未执行的操作。
evict():立即从Session缓存中删除指定的对象。
六 同步时间点与刷新时间点
1.同步时间点
 
事务提交是Hibernate中唯一的同步时间点,事务提交时将Session缓存中的数据同步到数据库。
 
2.刷新时间点
 
遇到Query查询、flush方法、事务提交时,执行删除与修改操作更新session缓存中的内容,只有在事务提交时才同步到数据库。
 
3.目的
 
刷新时间是为了在事务提交前执行针对数据库的操作,减少访问数据库的次数,降低数据库负担,只对删改操作有效,对插入与加载无效,对清空缓存无效。
 
4.flush
 
修改缓存中已有的对象,比如修改对象属性值,删除对象,不会清空缓存,不会同步到数据库,不影响那些与缓存内容无关的操纵,比如saveget操作不受flush影响,立即执行。
 
5.快照约束
 
同步时间点与刷新时间点都受快照的约束。