当前位置:网站首页>hiberate核心API/配置文件/一级缓存详解

hiberate核心API/配置文件/一级缓存详解

2022-06-25 22:01:00 _七里香

挺长,也详细。

如有帮助,欢迎留下足迹哦!

目录

核心API

Configuration

SessionFactory

Session

Transaction

配置文件详解

核心配置文件

映射配置文件

Hibernate的一级缓存

解释

Hibernate缓存特点

验证一级缓存操作

一级缓存的执行过程

一级缓存的存储结构

一级缓存的特性及原理

Hibernate的事务操作


核心API

Configuration

加载配置文件

SessionFactory

使用Configuration对象可以创建session工厂对象;根据核心配置文件中数据库的配置、映射文件部分来创建表;创建SessionFactory过程很消耗资源,建议一个项目只创建一个SessionFactory对象,即一个工具类即可。

具体实现:静态代码块,类加载时执行且只执行一次;

Session

类似于JDBC中的Connection。session是单线程对象,即只能自己用,不能共用,每次只能做一次。

Transaction

两个操作,一个commit(),一个rollback()

事务的四个特性:

原子性:事务要么都成功,要么都失败。

一致性:操作前后总量不变,如转账操作一个人多钱一个人少钱。

隔离性:多个事务同时操作同一个记录,各不影响。

持久性:最终事务要提交,commit到数据库。

配置文件详解

核心配置文件

1、数据库的信息配置是必须的,配置hibernate信息可有可无,注册映射文件必须的。

2、<hibernate-configuration>

<session-factory>注意位置。

3、必须在src下,且名称固定

映射配置文件

1、位置不固定,名称不固定,但不能是中文名

2、<properties name=”” column=””>,name中写的都必须与实体类的属性对应一致,column中写的都是数据库表中的列。class标签的name属性写的是全限定名(由类名右键复制可得到),table属性是将会生成的表名。

3、<properties name=”” column=””>标签中如果不写column属性,那么生成的字段名将会和name属性一致。

4、<properties name=”” column=”” type=””>标签的type属性一般不写,type属性用于设置生成表的字段的类型,自动根据实体类属性的类型转换为数据库所对应类型,不需要手动写。

Hibernate的一级缓存

解释

数据存到数据库中,数据库本身是文件系统。用流的方式操作文件效率不是很高

因此:

将数据存到内存中,此时不使用流的方式,可以直接读取内存中的内容。

把数据放到内存中,提高读取效率。

Hibernate框架中提供了很多优化方式:Hibernate一级缓存就是一个优化机制。

Hibernate缓存特点

一级缓存:默认就是打开的。使用范围是session的范围(session的创建-关闭之间),即session之外一级缓存是不存在的。

存储的数据必须是一种状态的数据--持久态的数据。

二级缓存:已经不使用了。有一种替代技术,被redis替代。默认不是打开的。使用范围是整个项目的范围(SessionFactory)。

验证一级缓存操作

<1>根据userid=1查询,返回对象

<2>再根据userid=1查询,返回对象,此时不会产生sql语句,可以验证一级缓存的存在。

一级缓存的执行过程

User u1 = session.get(User.class, 14);

执行时,先查询缓存中是否有数据,如果有则返回,如果没有就去查询数据库返回User对象(持久态的对象);同时将该持久态的对象放到一级缓存中(同时将一样的对象放到快照区),此时一级缓存中已有数据。

当第二次查询该目标时,仍然先去查询缓存看是否有数据(根据id值),如果有直接从一级缓存中获取数据;第二次查询时查到的虽然是同样的值但是会组成不同的对象。

一级缓存的存储结构

不是存储整个对象的形式,而是只存储对象的值,如userid=14,username=多少等;

一级缓存的特性及原理

修改操作:验证一级缓存的特性:持久态会自动更新数据库,不需要调用update()方法

原理:

创建session时,会创建一块一级缓存区,同时创建一块一样的区域--快照区(副本);当执行u1.setPassword("mimmmm");时,会将一级缓存中的user值进行修改,快照区里的user值不变,数据库中也不变;要修改的值没有变化时对数据库不做更改,性能很高。

即,一级缓存在事务提交之前代表用户的操作,快照区中的值代表的是数据库中现在的值,在提交事务时会比较一级缓存中的内容与快照区中的值是否一致,如果一致则不做修改,如果不一致则按一级缓存中的内容来更新数据库,此时快照区的值同时更新。

 

Hibernate的事务操作

事务代码的规则写法

try{

开启事务

提交事务

}catch(){

回滚事务

}finally{

关闭事务

}

 

原网站

版权声明
本文为[_七里香]所创,转载请带上原文链接,感谢
https://lan6193.blog.csdn.net/article/details/125435788