【 认真工作,享受生活 】

笑中千关过,愁内百事哀,争胜是祸,繁华似梦,平淡是福。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Hibernate 小知识

Posted on 2009-02-23 10:59  qiqi  阅读(194)  评论(0编辑  收藏  举报
1. get/load区别

如果记录存在,get返回对象(或代理对象);否则返回null。
如果记录存在,load返回对象;否则返回 NotObjectFoundException



2.hibernate Cache
2.1 一级缓存,在当前session内
2.2 Query Cache
Cache queries and results.
方法:
1. 在hiberante Configuration 文件中:
<property name="hibernate.cache.use_query_cache">true</property>
2. 查询时
Query query = session.createQuery("from Person p where p.id=1");
query.setCacheable(true);



2.3 二级缓存, 跨session . 如EHCache


3. load 与 CreateQuery 在处理Cache的区别

首先,load时在一个session中,一级缓存总是有效的。比如下面的只issue sql操作一次

 
Java代码 复制代码
  1. Session session = getSessionFactory().openSession();   
  2.   Transaction tx = session.beginTransaction();   
  3.   Person person1 = (Person) session.load(Person.class, 1L);   
  4.   System.out.println(person1.getFirstName());   
  5.   Person person2 = (Person) session.load(Person.class, 1L);      
  6.   System.out.println(person2.getFirstName());          
  7.   tx.commit();   
  8.   session.close();  


其次,如果用CreateQuery有点不同,比若下面的需要issue sql操作两次

Java代码 复制代码
  1. Session session = getSessionFactory().openSession();   
  2.  Transaction tx = session.beginTransaction();   
  3.  Query query = session.createQuery("from Person p where p.id=1");   
  4.  Iterator it = query.list().iterator();   
  5.  while (it.hasNext ()){   
  6.    Person p = (Person) it.next();   
  7.    System.out.println(p.getFirstName());   
  8.  }   
  9.  query = session.createQuery("from Person p where p.id=1");   
  10.  it = query.list().iterator();   
  11.  while (it.hasNext ()){   
  12.    Person p = (Person) it.next();   
  13.    System.out.println(p.getFirstName());   
  14.  }          
  15.  tx.commit();   
  16.  session.close();  


原因是session cache时是根据key(load方法中传入的ID)来缓存的。解决的方法是:
1. 用load,如上面的代码
2. 用查询缓存,如上面的介绍

Java代码 复制代码
  1. Session session = getSessionFactory().openSession();   
  2.  Transaction tx = session.beginTransaction();   
  3.  Query query = session.createQuery("from Person p where p.id=1");   
  4.  query.setCacheable(true);   
  5.  Iterator it = query.list().iterator();   
  6.  while (it.hasNext ()){   
  7.     Person p = (Person) it.next();   
  8.     System.out.println(p.getFirstName());   
  9.  }   
  10.  query = session.createQuery("from Person p where p.id=1");   
  11.  query.setCacheable(true);   
  12.  it = query.list().iterator();   
  13.  while (it.hasNext ()){   
  14.     Person p = (Person) it.next();   
  15.     System.out.println(p.getFirstName());   
  16.  }   
  17.  tx.commit();   
  18.  session.close();