hibernate_day03

本文介绍了Hibernate中的一级缓存机制及其工作原理,探讨了事务控制的重要性和可能遇到的问题,并展示了几种核心API的使用方法。

一、Hibernate的一级缓存


1.持久态对象能够自动更新数据库得益于Hibernate的一级缓存。


2.hibernate的缓存分为一级缓存和二级缓存,Hibernate的这两级缓存都位于持久化层,存储的就是数据库数据的备份。


3.Hibernate的一级缓存就是指Session缓存,Session缓存是一块内存空间,用来存放相互管理的java对象,在使用hibernate查询对象的时候,首先会使用


对象属性的OID值在hibernate的一级缓存中进行查找,如果找到匹配OID的对象,就直接将该对象从一级缓存中取出使用,不会再查询数据库,如果没有


找到相同的OID值的对象,则会去数据库中查找相应的数据。当从数据库中查询到所需要的数据时,该数据信息也会放置到一级缓存中。hibernate的一级缓存的作用就是减少


对数据库的访问次数。一级缓存也被称为Session基本的缓存。


4.当调用Session的close方法时,Session缓存会清空


5.一级缓存的内部结构:(快照区)


Hibernate向一级缓存存放数据时,同时复制一份数据放到Hibernate的快照中,当使用commit()方法提交事务的时候,同时会清理Session的一级缓存,这时会使用OID判断一级缓存中的对象和快照中的对象是否一致,如果两个对象中的属性发生了变化,则执行update语句,将缓存的内容同步到数据库中,并且更新快照;如果一致,则不执行update语句。Hibernate快照的作用就是确保一级缓存中的数据和数据库中的数据一致。


二、Hibernate的事务控制

1.一项事物是由一条或者多条操作数据库的SQL语句组成的一个不可分割的工作单元。这些单元要么同时成功,要么同时失败。

2.ACID:原子性、一致性、隔离性以及持久性、

3.事务并发产生的问题:当多个事务同时访问相同的数据时可能会发生并发问题

(1)脏读:一个事务读取到另外一个事务还没提交的数据

(2)不可重复读:一个事务读到了另外一个事务已经提交的update的数据,导致在同一个事务中的多次查询结果不一致

(3)虚度/幻读:一个事务读到了另外一个事务已经提交的insert的数据,导致在同一个事务中多次查询结果不一致

4.事务的隔离级别

(1)Hibernate的事务隔离级别可以在hibernate.cfg.xml文件中进行相应的配置

(2)事务的控制应该在service层实现,最重要的就是i如何确保在Servcie中开启的事务时使用的Session对象和Dao中多个操作使用的是同一个Session对象

可以使用参数传递session对象还可以使用ThreadLocal将业务层获取到Session绑定到当前线程中,然后在Dao中获取Session的时候,都从当前线程中获取

(3)在Hibernate中我们只需要完成一段配置就可以了,Hibernate5中自身提供了三种管理Session对象的方法


1)Session对象的生命周期与本地线程绑定


2)Session对象的生命周期与JTA事务绑定


3)Hibernate委托程序来管理Session对象的生命周期


在hibernate.cfg.xml中进行如下配置:

<property name="hibernate.current_session_context_class">thread</property>

然后使用sessionFactory的getCurrentSession()方法就可以获取到当前线程的session对象。

而且Hibernate中提供的这个与线程绑定的session可以不用关闭,当线程执行结束过后,就会自动关闭。

三、Hibernate的其他API

1.Query

(1)Query代表面向对象的一个Hibernate查询操作,在HIbernate中,通常使用session.createQuery()方法接受一个HQL语句,然后调用Query的list()或者

uniqueResult()方法执行查询,HQL是面向对象的。

(2)在Hibernate中使用Query对象的使用步骤

1)获取Hibernate的session对象

2)编写SQL语句

3)调用session.createQuery()创建查询对象

4)如果HQL语句包含参数,则调用Query的setParameter()设置参数
5)调用了Query对象的list()或者uniqueResult()方法执行查询


2.Criteria
(1)Criteria是一个完全面向对象,可扩展的API,是Hibernate的核心查询对象,Criteria查询又叫做QBC查询。


(2)使用Criteria对象查询数据的主要步骤


1)获取Hibernate的session对象


2)通过Session获得Criteria对象


3)使用Restrictions的静态方法创建条件对象

4)向Criteria对象中添加Criteria查询条件

5)执行Criteria的list()或者uniqueResult()获取结果

3.SQLQuery

(1)注意这个sql语句不会直接封装到实体对象,需要我们手动写代码才可以封装到实体中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值