(四)Hibernate中的主键生成策略&一级缓存&事务管理&其它API

Hibernate中的主键生成策略&一级缓存&事务管理&其它API

持久化类的编写规则:
  • 持久化:就是将内存中的一个对象持久化到数据库中的过程。hibernate框架就是用来进行持久化的框架。
  • 持久化类:一个Java对象与数据库的表建立了映射关系,那么这个类在hibernate中称为是持久化类。
    持久化类=Java类+映射文件
规则说明
对持久化类提供一个无参的构造方法hibernate底层需要使用反射生成实例
属性需要私有,对私有属性提供pubic的get和set方法hibernate中获取,设置对象的值
对持久化类提供一个唯一标识OID与数据库主键对应java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一个记录,在hibernate中通过持久化类的OID的属性区分是否是同一个对象
持久化类中属性尽量使用包装类类型避免歧义
持久化类不要使用final进行修饰延迟加载本身是hibernate一个优化手段。返回的是一个代理对象。如果不能产生代理对象,延迟加载也就失效。load方法和get方法一致
一、主键生成策略

主键的类型:

  • 自然主键:把具有业务含义的字段作为主键。
  • 代理主键:把不具有业务含义的字段作为主键。(推荐)
    在这里插入图片描述
二、 Hibernate的持久化类的三种状态:

1.瞬时态(transient):不存在持久化标识OID,尚未与hibernate Session关联。在数据库中也没有记录

2.持久态(persistent):存在持久化标识OID,加入到了Session缓存中,并且相关联的Session没有关闭,在数据库中有对应的记录。注:持久态对象是在事务还未提交前变成持久态的。

3.脱管态(detached):脱管态对象存在持久化标识OID,并且任然与数据库中的数据存在关联,只是失去了与当前Session的关联。托管状态对象发生改变时Hibernate不能检测到。

区分对象的三种状态:
在这里插入图片描述
三种状态的转换图:

在这里插入图片描述

持久化对象能够自动更新数据库:(依赖hibernate的一级缓存)

在这里插入图片描述

三、 一级缓存

缓存:提高应用的运行性能。

Hibernate的缓存分为一级缓存,二级缓存。

  • 一级缓存:(Session缓存)生命周期和Session一样,其作用是减少对数据库的访问次数。是hibernate的内置缓存,不能被卸载。
  • 二级缓存:

一级缓存的特点:

  • 当程序调用Session接口的sava()、update()、savaOrUpdate()时,如果缓存中没有相应的对象,hibernate就会自动把从数据库中查询到的相应对象信息加入到一级缓存
    *当调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法是,会在缓存中判断该对象是否存在,有则返回,无则去数据库中查询并添加到一级缓存
    *当调用Session的close()、方法时,Session缓存会被清空。

证明一级缓存存在:
在这里插入图片描述
一级缓存的内部结构:(快照区)
在这里插入图片描述

四、 事务管理

事务:
事务的四个特性:
事务的并发问题:
事务的隔离级别:
Hibernate中的事务管理:

在配置文件中设置事务的隔离级别:hibernate.cfg.xml文件中的标记中进行的。
在这里插入图片描述
事务管理:线程绑定的Session
在这里插入图片描述
其实最主要的是如何保证在Service中开启事务时使用的Session对象和DAO中多个操作使用的是同一个Session对象。
实现的两种办法:
可以在业务层获取到Session,并将Session作为参数传递给DAO
可以使用ThreadLocal将业务层获取的Session绑定到当前线程中,然后在DAO 中获取Session的时候,都从当前线程中获取

1、在hibernate.cfg.xml中进行如下配置:
在这里插入图片描述
2、更改工具类:

public static Session getCurrentSession(){
	return sessionFactory.getCurrentSession();
}
五、Hibernate的其它API
  • Query

Query接口用于接收HQL,查询多个对象。
HQL:hibernate query language Hibernate查询语言,其与SQL与发类似,面向对象的查询语言。
在这里插入图片描述

  • Criteria

Criteria:QBC(Query By Criteria)
更加面向对象的一种查询方式。
在这里插入图片描述

*SQLQuery

SQLQuery接口用于接收一个sql语句进行查询
方法:list()
uniqueResult()
调用这二者中的一个进行查询。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值