Hibernate框架

Hibernate是一个基于元数据轻量级ORM框架

  • 元数据(Meta Data):Data about data (关于数据的数据)描述数据(数据库)以及环境相关的数据(关联数据)。
  • 轻量级:占用的资源不是很多,没有侵入性。
  • ORMObject – Relation Mapping

 Java中对象和数据库的相关内容进行关系映射。类和表,对象和表中的数据,属性和字段。操作数据库采用面向对象的方式完成。

对象模型

关系模型

面向对象分析设计(UML)

数据库设计(PD)

(关系)

(关系)

属性

字段

Java类型

SQL类型

对象(主键属性OID)

记录(PK)

  • POJO(Plain Ordinary Java Object) 无格式的普通java对象,java对象中没有包含任何的逻辑代码,从数据层面上来看,POJO对象可以看做数据库中的实体化(对象化)表现方式。也称为实体类(Entity Class)

 也称为域模型对象(domain

实体域模型对象(UserPOJO

过程域模型对象(DAO,BO

l 事件域模型对象(事件,异常)

  • VO(Value Object) 描述数据的对象。(Page 分页类)  
  • 持久化:

 狭义:将内存对象永久保存到数据库过程

 广义:就是指对数据的CRUD

l Hibernate框架应用环境搭建

  • 拷贝常用jar
  • 创建hibernate.cfg.xml配置文件

 连接数据库信息

 方言

 管理映射文件

 其他(属性配置等)

l Hibernate框架的核心API

  • SessionFactory
  • Session
  • Transaction
  • Query
  • Criteria
  • Configuration

l Hibernate框架的主键生成策略

  • 表示如何生成表的主键
  • 主键的类型

代理主键(推荐)

提供一个和业务无关并且能够唯一标识一条记录的字段作为主键(一般是自增的,整型)

自然主键

l 提供一个与业务相关的主键

  • 主键生成策略有3种方式

由数据库来生成主键(代理主键)

l native :表示由方言决定采用什么数据库的主键生成方式。

如果是mysql方言,那么就会采用自增长方式

如果是Oracle方言,那么就会采用序列方式

l sequence :表示采用数据库的序列方式生成主键,可以应用在OracleDB2数据库中

l identity :表示采用自增长的主键生成方式,可以应用MySQLSQL Server 数据库

Hibernate框架来生成主键(代理主键)

l uuid :表示由框架根据参数(IP地址,JVM启动时间,系统时间,计算器)生成3216进制的数字字符串。推荐使用。主键属性必须是字符串类型。

n 表示数据量大,添加数据效率高,查询效率低,通用移植性好

l increment:表示由框架本身提供的计数器的方式自动增长。

由用户来生成主键(自然主键)

l assigned :表示主键由用户自己维护。

Hibernate框架的对象三种状态

  • 瞬时状态(Transient Object ) 临时状态

u 数据库中没有与之对应的数据

u 对象与框架没有关联

  • 持久化状态(Persistent Object)

u 数据中一般是存在与之对应的数据

u 对象与框架一定关联

  • 游离状态(Detached Object) 离线状态,托管状态

u 数据库中一定有与之对应的数据

u 对象与框架没有关联,或连接断开。

Hibernate框架中保存操作

  • 瞬时状态的对象可以保存
  • 持久化状态的对象不能保存

持久化状态的含义就是对象和数据库中的一条数据对应,那么再保存就会有冲突了,所以不能保存。

  • 游离状态的对象不应该保存

主键生成策略不是自己维护的情况下,可以保存成功。

Hibernate框架中的更新操作(主键更新)

  • 瞬时状态的对象不能更新
  • 持久化状态的对象不能更新

不需要显示调用update方法进行更新。持久化对象属性值变化会自动更新

  • 游离状态的对象可以更新

Hibernate框架中的删除操作(主键删除)

  • 瞬时状态的对象不能删除
  • 持久化状态的对象可以删除
  • 游离状态的对象可以删除

删除时框架会先查询(select)数据库中是否存在,如果存在则可以删除。

Hibernate的主键查询

  • Get

u 返回结果:持久化对象或null(非空判断)

u 不支持延迟加载

u 支持缓存

  • Load

u 返回结果:持久化对象或异常或代理对象

u 默认支持延迟加载

禁用延迟加载,可以设置<class lazy=”false”/>

u 支持缓存

Hibernate面向对象查询

  • HQL

其实就是对SQL的封装

u Query接口

u list()方法

l 支持缓存,但自己不利用缓存

l 如果希望利用缓存,可以配置查询缓存

u iterate()方法 (N+1条语句)

l 支持缓存,并且利用缓存

l 使用一般和带缓存的方法一起用

批量操作DML(insert,update,delete)

l  不支持缓存操作

  • QBC

u 动态参数查询

l Hibernate框架的映射关系

  • 基本的映射关系

多对一 (学生和班级)

l <many-to-one>

l 级联关系

级联不能使用deleteall

l 延迟加载

l 抓取策略

抓取策略是join的话,那么延迟加载不起作用。

一对多(班级和学生)

l 级联关系

l 延迟加载

l 抓取策略

反转操作(inverse=”true”)

多对多(学生和课程)

级联不应该使用deleteall

l 在任意其中一端设置反转操作

中间表示的两个外键不要为null,表示联合主键

u 自关联

l 是双向的一对多和多对一的特殊情况

使用一张表来描述数据的关系,外键字段可以为null

l MyEclipse-Tools

  • 由类到表
  • 由表到类(可以提高开发效率)

l Hibernate框架的延迟加载

  • 应用原因
  • 应用场合
  • 应用标签
  • 使用约束
  • 使用有效期

l 解决延迟加载的方案

  • 保证Session在视图层是打开状态(OpenSessionInView模式)
  • ThreadLocal + Filter

l Hibernate框架的缓存

  • 一级缓存(session缓存)

u 默认支持

  • 二级缓存(SessionFactroy缓存)

u 默认不支持

u Ehcache

  • 查询缓存(HQL,Query)

u 不推荐使用,查询命中率不是很高。

l Hibernate框架解决数据冲突问题

  • 悲观锁

行级锁 select .. for update

u 类似线程同步,性能低

  • 乐观锁(推荐)

u 时间戳

版本号(Hibernate)

l Hibernate框架的注解

  • 注解和配置文件的比较
  • JPA
  • Hibernate框架应用开发时常用的注解

l Hibernate框架的POJO类设计规则

  • 一定要存在默认的构造方法
  • 构造方法可以是private的,但是对于cglib代理的应用,修饰符至少protected
  • 尽量不要使用final修饰
  • 尽量实现可序列化接口
  • 属性的get/set方法是需要提供的,如果不提交的话,需要设置标签的access="field"

l Hibernate框架的总结

  • 优点

轻量级的ORM框架

u 提供延迟加载功能,缓存机制

u 透明持久化,操作对象就等同操作数据库,隐藏了持久化的过程,使操作起来更加容易

  • 缺点

u 由于面向对象的操作方式,进行大数据量操作时性能比较低

执行效率比 jdbc,ibatis

u 影响表的设计原则

l Hibernate框架的竞争

  • JPA(规范)
  • Oracle TopLink
  • SUN JDO
  • Apache OJB

框架的优化

  • Struts2

u 去掉使用不到的拦截器

过滤器的过滤规则尽量不要使用/*

关闭开发模式(devMode)

  • Hibernate

u 尽量使用延迟加载

u 使用缓存(只读)

u 尽量使用乐观锁代替悲观锁

尽量使用框架的最新版本,一般会有性能方面的支持

推荐使用uuid主键生成策略,移植性好,支持大数据量

原文地址:https://www.cnblogs.com/hkdpp/p/10495877.html