码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-09-23 16:22:50      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

一、抓取策略。

  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.)

  

 

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

标签:

原文地址:http://www.cnblogs.com/kuangdaoyizhimei/p/4832248.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!