【Java EE 学习第48天】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】

一、抓取策略。

  1.hibernate中提供了三种抓取策略。

    (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式。使用这种抓取方式hibernate会在select中内连接的方式获取对象的关联对象或者关联集合。

    (2)查询抓取(select Fetch):这种抓取方式会另外发送一条select语句抓取当前对象的关联实体或者集合。除非指定lazy=false,否则只有在真正访问关联关系的时候才会执行第二条select语句。

    (3)子查询抓取(subselect Fetch):另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合。除非指定lazy=false,否则只有在真正访问关联关系的时候才会执行第二条select语句。

  2.案例,获取选修了课程号为1或者2的所有学生信息。

    结果表明,如果使用select或者join,则效率相同,发送的sql语句完全相同;如果使用subselect的话,效率要高很多,只需要两条sql语句。

 1 package com.kdyzm.fetchtest;
 2
 3 import java.util.List;
 4 import java.util.Set;
 5
 6 import org.hibernate.Session;
 7 import org.hibernate.SessionFactory;
 8 import org.hibernate.cfg.Configuration;
 9 import org.junit.Test;
10
11 import com.kdyzm.hibernate.domain.Course;
12 import com.kdyzm.hibernate.domain.Student;
13
14 public class FetchTest {
15     private static SessionFactory sessionFactory;
16     static{
17         Configuration configuration=new Configuration();
18         configuration.configure();
19         sessionFactory=configuration.buildSessionFactory();
20     }
21     /*
22      * n+1条查询是显著的特点。
23      */
24     @Test
25     public void baseTest(){
26         Session session=sessionFactory.openSession();
27         List<Student>students=session.createQuery("from Student").list();
28         for(Student student:students){
29             Set<Course>courses=student.getCourses();
30             for(Course course:courses){
31                 System.out.println(course);
32             }
33         }
34         session.close();
35     }
36
37     /*
38      * 查询班级cid为1,3的所有学生
39      *
40      * 如果需要用到子查询一般就是用subselect(fetch属性值)
41      * 使用subselect只需要两条SQL语句。
42      *
43      */
44     @Test
45     public void test2(){
46         Session session=sessionFactory.openSession();
47         List<Course>courses=session.createQuery("from Course where cid in(1,3)").list();
48         for(Course course:courses){
49             Set<Student>students=course.getStudents();
50             for(Student student:students){
51                 System.out.println(student);
52             }
53         }
54         session.close();
55     }
56
57     /*
58      * 总结:以上的需求中,使用select和join方法效率相同,使用子查询subselect效率最高。
59      */
60
61
62 }

FetchTest.java

二、二级缓存

  1.二级缓存并没有被Hibernate实现,必须借助第三方插件实现。

  2.二级缓存常见的缓存策略提供商:


Cache


Provider class


Type


Cluster Safe


Query Cache Supported


Hashtable (not intended for production use)


org.hibernate.cache.HashtableCacheProvider


memory


yes


EHCache


org.hibernate.cache.EhCacheProvider


memory,disk


yes


OSCache


org.hibernate.cache.OSCacheProvider


memory,disk


yes


SwarmCache


org.hibernate.cache.SwarmCacheProvider


clustered (ip multicast)


yes (clustered invalidation)


JBoss Cache 1.x


org.hibernate.cache.TreeCacheProvider


clustered (ip multicast), transactional


yes (replication)


yes (clock sync req.)


JBoss Cache 2


org.hibernate.cache.jbc.JBossCacheRegionFactory


clustered (ip multicast), transactional


yes (replication or invalidation)


yes (clock sync req.)

  

时间: 2024-10-06 01:18:58

【Java EE 学习第48天】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】的相关文章

hibernate detached分离查询 与 抓取策略注意事项

1.detached在抓取策略为 jion显式左外连接查询情况下 会产生笛卡儿积现象 DetachedCriteria dc = DetachedCriteria.forClass(Topic.class); dc.add(Restrictions.like("title", "%%")); Criteria criteria = dc.getExecutableCriteria(session); criteria.setFirstResult((currentp

Hibernate 原汁原味的四种抓取策略(转)

原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html     尊重原作者,访问原创地址 最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog 中都没有找到详细 介绍 Hibernate 文档中所说的原汁原味的抓取策略, 综合懒加载等等特性混在了一起, 所 以在这自己在借鉴了他人的基

【Hibernate 8】Hibernate的调优方法:抓取策略

在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetching strategy):当应用程序需要在关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O / R映射的元数据中声明,也可以在特定的HQL或条件查询(Criteria Query)中重载声明. 二.Hibernate的抓取策略 在Hibernate中,主要包括四种抓

Hibernate学习---第十一节:Hibernate之数据抓取策略&amp;批量抓取

1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // 基于标准的 sql 语句查询 String sql = "select * from t_person"; // 通过 createSQLQuery 获取 SQLQuery,而 SQLQuer 是 Query的子类 SQLQuery query = session.createSQLQue

hibernate抓取策略学习

一.hibernate抓取策略概述 Hibernate抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明. 需要注意的是:hibernate的抓取策略只影响get load 方法,对hql是不影响的. 二.hibernate 抓取策略分类 hibernate有如下

Hibernate学习笔记(八) — 懒加载与抓取策略

懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用.总结一句话:什么时候需要数据,什么时候加载. 一.懒加载 1.1 类的懒加载 由javassist产生的代理类与Classes类是继承关系, session.load()方法产生的是代理对象,该代理类是持久化类的子类 /** * 类的懒加载 */ @Test public void testClass_l

【Hibernate学习】 —— 抓取策略(注解方式)

当应用程序需要在关联关系间进行导航的时候,hibernate如何获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒加载,加载一个实体时,定义懒加载的属性不会马上从数据库中加载. FetchType.EAGER:急加载,加载一个实体时,定义急加载的属性会立即从数据库中加载. 在项目中的体现,我这里有两个实体,一个放基础数据的实体,另一个是放操作记录的实体.这两个实体的关系是一对一关系,因此要把基础数据中的主键放在操作记录中作为外键,查询的时候查询操作记录表顺便把基础表相关信息

Hibernate fetch 抓取策略

上一篇文章(Hibernate的延迟加载 ,懒加载,lazy)说到Hibernate的延迟加载跟fetch的配置还有一定关系,下面就来讨论下fetch的用法. 抓取策略(fetch)是指当我们去查询一个对象里面所关联的其他对象时,按照哪种方法去抓取关联对象. fetch策略一共有四种:select.subselect.join.batch,下面我们一一介绍.我们还是用上面介绍延迟加载的相关表和实体类. Company表: Employee表(employee_company_id为外键) Com

hibernate的延迟加载和抓取策略

一,延迟加载 1.实体类延迟加载 通过代理机制完成,由javassist类库实现运行时代理,修改实体类的字节码实现了运行时代理     <class lazy="true|false">     实体级别的延迟加载默认值为true,意味实体对象是延迟加载,只影响load方法.      <class lazy="true|false">其他查询方式都是立即加载              2.关联属性延迟加载 默认情况下除了<one-to