首页 > 代码库 > Hibernate详讲

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

修改缓存中已有的对象,比如修改对象属性值,删除对象,不会清空缓存,不会同步到数据库,不影响那些与缓存内容无关的操纵,比如save\get操作不受flush影响,立即执行。

5.快照约束

同步时间点与刷新时间点都受快照的约束。

 

Hibernate详讲