一、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语句不会直接封装到实体对象,需要我们手动写代码才可以封装到实体中
本文介绍了Hibernate中的一级缓存机制及其工作原理,探讨了事务控制的重要性和可能遇到的问题,并展示了几种核心API的使用方法。
212

被折叠的 条评论
为什么被折叠?



