Hibernate的介绍与使用

框架介绍

Hibernate是一个Java领域的持久化框架,是一个ORM框架

ORM

对象/关系映射
在这里插入图片描述
ORM的思想:
将关系数据库中表中的记录映射称为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作
ORM采用元数据来描述对象-关系映射细节,元数据通常采用XML格式,并且存放在专门的对象-映射文件中。

开发步骤

在这里插入图片描述

创建持久化类

Hibernate不要求持久化类继承任何父类或实现接口,这可以保证代码不被污染,这就是Hibernate被称为低侵入式设计的原因。

  • 提供一个无参的构造器
    使Hibernate可以使用Constructor.newInstance()来实例化持久化类

  • 提供一个标识属性(identifier property
    通常映射为数据库表的主键字段,如果没有该属性,一些功能将不起作用。

  • 为类的持久化类字段声明访问方法(get/set)
    Hibernate对JavaBeans风格的属性实行持久化

  • 使用非final类
    在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何接口,Hibernate使用CGLIB生成代理,如果使用的是final类,则无法生成CGLIB代理。

  • 重写equals和hashCode方法
    如果需要把持久化类的实例放到set中(当需要进行关联映射时),则应该重写这两个方法。

创建对象-关系映射文件

Hibernate采用XML格式的文件来指定对象和关系数据之间的映射,在运行时Hibernate将根据这个映射文件来生成各种SQL语句,映射文件的扩展名为.hbm.xml
Hibernate使用对象标识符(OID)来建立内存中的对象和数据库表中记录的对应关系
Hibernate推荐在数据表中使用代理主键
在这里插入图片描述

创建Hibernate配置文件

该配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性。Hibernate从其配置文件中读取和数据库连接的有关信息,这个文件应该位于应用的classpath下
每个Hibernate配置文件对应一个Configuration对象。
在这里插入图片描述

通过Hibernate API编写访问数据库的代码

在这里插入图片描述

Hibernate进行数据持久化操作

  • 编写持久化类:POJO+映射文件
  • 获取Configuration

Configuration类:
负责管理Hibernate的配置信息,包括:
(1)Hibernate运行的底层信息:数据库的URL、用户名等(对应hibernate.cfg.xml)
(2)持久化类与数据表的映射关系(*.hbm.xml文件)

  • 获取SessionFactory对象

SessionFactory接口
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的。SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。构造SessionFactory非常的消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
Hibernate4新增了一个ServiceRegistry接口,所有基于Hibernate的配置或者服务都必须统一向这个ServiceRegistry注册后才能生效。
Session接口:
Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短,session对象有一个一级缓存,显示执行flush之前,所有持久化层操作的数据都缓存在session对象处。
持久化类与Session关联起来之后就具有了持久化的能力!!!

  • 获取Session,打开事务

Session概述:
Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和加载Java对象的方法
Session具有一个缓存,位于缓存中的对象称为持久化对象,他和数据库中的相关记录对应。Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程称为刷新缓存(flush).
站在持久化的角度,Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态、删除状态。
Session缓存(Java集合)可减少Hibernate应用程序访问数据库的频率

flush缓存:
flush:Session按照缓存中对象的属性变化来同步更新数据库。
默认情况下Session在以下时间点刷新缓存:

  • 显式调用Session的flush()方法
  • 当应用程序调用Transaction的commit()方法时,该方法先flush(),然后再向数据库提交事务。
  • 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,会先flush缓存,以保证查询结果能够反映持久化对象的最新状态。
    commit()和flush()方法的区别:
    flush执行一系列sql语句,但不提交事务;
    commit方法先调用flush()方法,然后提交事务,提交事务意味着对数据库操作永久保存下来。
  • 用面向对象的方式操作数据库
  • 关闭事务,关闭Session

Hibernate与触发器

Hibernate与数据库中的触发器协同工作时,会造成两类问题:

  • 触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中,他执行的操作对Session是透明的。
  • Session的update()方法盲目的激发触发器:无论游离对象的属性是否发生变化,都会执行update语句,而update语句会激发数据库中相应的触发器。

解决方案:

  • 在执行完Session的相关操作之后,立即调用Session的flush()和reflush()方法,迫使Session的缓存和数据库同步(reflush()方法重新从数据库中加载对象)
    在这里插入图片描述
  • 在映射文件的<class>元素中设置select-before-update属性:当Session的update或saveOrUpdate()方法更新一个游离对象时,会先执行Select语句,获得当前游离对象在数据库中的最新数据,只有在不一致的情况下才会执行update语句。

Hibernate缓存

Hibernate提供两个级别的缓存:

  • 第一级别的缓存是Session级别的缓存,它是属于事务范围内的缓存,这一级别的缓存是由hibernate管理的。
  • 第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围的缓存
    (1)内置缓存
    Hibernate自带的,不可卸载。通常在Hibernate的初始化阶段,Hibernate会把映射元数据和预定于的SQL语句放到SessionFactory的缓存中,映射元数据是映射文件中数据的复制,该内置缓存是只读的。
    (2)外置缓存
    是一个可配置的缓存插件。在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存中的数据是数据库数据的复制,外置缓存的物理介质可以是内存或硬盘。外置缓存也叫二级缓存,对于那些很少被修改并且不是很重要的数据,允许出现偶尔的并发问题的情况下适合放入二级缓存中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值