Hibernate查询方法与缓存的关系

开发 后端
本文结合这两种Hibernate查询方法来说明一下缓存的作用。在项目开发中,通常是通过两种方式来执行对数据库的查询操作的。

在开发中,通常是通过两种方式来执行对数据库的查询操作的。一种方式是通过ID来获得单独的Java对象,另一种方式是通过HQL语句来执行对数据库的查询操作。下面就分别结合这两种Hibernate查询方法来说明一下缓存的作用。

通过ID来获得Java对象可以直接使用Session对象的load()或者get()方法,这两种方式的区别就在于对缓存的使用上。 下面我们来具体看看Hibernate查询方法的实现。

load()方法

在使用了二级缓存的情况下,使用load()方法会在二级缓存中查找指定的对象是否存在。

在执行load()方法时,Hibernate首先从当前Session的一级缓存中获取ID对应的值,在获取不到的情况下,将根据该对象是否配置了二级缓存来做相应的处理。

如配置了二级缓存,则从二级缓存中获取ID对应的值,如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行,如未配置延迟加载则从数据库中直接获 取。在从数据库获取到数据的情况下,Hibernate会相应地填充一级缓存和二级缓存,如配置了延迟加载则直接返回一个代理类,只有在触发代理类的调用 时才进行数据库的查询操作。

在Session一直打开的情况下,并在该对象具有单向关联维护的时候,需要使用类似Session.clear(),Session.evict()的方法来强制刷新一级缓存。

get()方法

get()方法与load()方法的区别就在于不会查找二级缓存。在当前Session的一级缓存中获取不到指定的对象时,会直接执行查询语句从数据库中获得所需要的数据。

在Hibernate查询方法中,可以通过HQL来执行对数据库的查询操作。具体的查询是由Query对象的list()和iterator()方法来执行的。这两个方法在执行查询时的处理方法存在着一定的差别,在开发中应该依据具体的情况来选择合适的方法。

list()方法

在执行Query的list()方法时,Hibernate查询方法是首先检查是否配置了查询缓存,如配置了则从查询缓存中寻找是否已经对该查询进行了缓 存,如获取不到则从数据库中进行获取。从数据库中获取到后,Hibernate将会相应地填充一级、二级和查询缓存。如获取到的为直接的结果集,则直接返 回,如获取到的为一些ID的值,则再根据ID获取相应的值(Session.load()),最后形成结果集返回。可以看到,在这样的情况下,list ()方法也是有可能造成N次查询的。

查询缓存在数据发生任何变化的情况下都会被自动清空。

iterator()方法

Query的iterator()方法处理查询的方式与list()方法是不同的,它首先会使用查询语句得到ID值的列表,然后再使用Session的load()方法得到所需要的对象的值。

在获取数据的时候,应该依据这4种获取数据方式的特点来选择合适的方法。在开发中可以通过设置show_sql选项来输出Hibernate所执行的SQL语句,以此来了解Hibernate查询方法是如何操作数据库的。

 

【编辑推荐】

  1. Hibernate缓存机制探讨
  2. 解析Hibernate的批量删除功能
  3. Hibernate一对多关系的处理a>
  4. Struts与Hibernate的完美结合方案
  5. 层层解析Hibernate中的事务的滥用
责任编辑:佚名 来源: JavaEye
相关推荐

2009-06-08 10:20:01

Hibernate查询

2009-06-29 09:03:31

Hibernate多条

2009-09-22 11:24:07

Hibernate查询

2010-11-15 16:26:46

Oracle系统时间

2010-06-10 17:59:05

2010-10-29 11:22:23

Oracle用户会话

2009-09-25 15:34:42

Hibernate关联

2019-11-15 10:01:07

MySQL数据库数据

2009-05-21 09:24:42

表空间查询Oracle

2010-11-25 16:40:11

MySQL大表重复字段

2013-05-27 10:11:25

路由器查询方式路由器递归查询路由器扑朔图

2012-07-30 09:50:28

MongoDB

2009-07-21 14:15:00

iBATIS.NET多

2024-03-04 11:13:29

Django数据库Python

2022-06-21 08:13:34

MySQL查询数据库

2009-06-17 15:13:30

2009-01-27 21:00:00

服务器数据库SQL Server

2012-02-03 11:31:33

HibernateJava

2010-07-12 17:12:37

JPA 2.0缓存Hibernate缓存Java EE

2009-07-02 09:40:14

Hibernate的继
点赞
收藏

51CTO技术栈公众号