Hibernate Session概述
Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存、更新、删除和加载Java对象的方法。
Session具有一个缓存,位于缓存中的对象称为持久化对象,它和数据库中的相关记录对应。Session能够在某些时间点,按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一过程被称为刷新缓存(flush)。
站在持久化的角度,Hibernate把对象分为4种状态:持久化状态、临时状态、游离状态、删除状态。Session的特定方法能使对象从一个状态转换到另一个状态。
Session缓存
在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存。只要Session实例没有结束生命周期,且没有清理缓存,则存放在它缓存中的对象也不会结束生命周期。
Session缓存可减少Hibernate应用程序访问数据库的频率。
操作Session缓存:
flush():Session按照缓存中对象的属性来同步更新数据库
默认情况下Session会在以下时间点刷新缓存:
显式调用Session的flush()方法
当应用程序调用Transaction的commit()方法时,该方法先刷新缓存(flush),然后向数据库提交事务
当应用程序执行一下儿查询(HQL,Criteria)操作时,如果缓存中持久化对象的属性已经发生了变化,会先flush()缓存,以保证查询结果能够反映持久化对象的最新状态
flush缓存的例外情况:如果对象使用native生成器生成OID,那么当调用Session的save()方法保存对象时,会立即执行向数据库插入改实体的insert语句。
commit()和flush()方法的区别:flush执行一系列的sql语句,但不提交事务;commit方法先调用flush方法,然后提交事务,意味着提交事务,意味着对数据库操作永久保存下来。
refresh():会强制发送SELECT 语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致!
clear():清理缓存
测试类:
1 package com.yl.hibernate.entities; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Date; 6 7 import org.hibernate.Session; 8 import org.hibernate.SessionFactory; 9 import org.hibernate.Transaction; 10 import org.hibernate.cfg.Configuration; 11 import org.hibernate.service.ServiceRegistry; 12 import org.hibernate.service.ServiceRegistryBuilder; 13 import org.junit.After; 14 import org.junit.Before; 15 import org.junit.Test; 16 17 public class HibernateTest { 18 19 private SessionFactory sessionFactory; 20 private Session session; 21 private Transaction transaction; 22 23 @Before 24 public void init() { 25 Configuration configuration = new Configuration().configure(); 26 ServiceRegistry serviceRegistry = 27 new ServiceRegistryBuilder().applySettings(configuration.getProperties()) 28 .buildServiceRegistry(); 29 30 sessionFactory = configuration.buildSessionFactory(serviceRegistry); 31 32 session = sessionFactory.openSession(); 33 34 transaction = session.beginTransaction(); 35 } 36 @After 37 public void destory() { 38 transaction.commit(); 39 40 session.close(); 41 42 sessionFactory.close(); 43 } 44 45 @Test 46 public void testSessionCache() { 47 News news = (News)session.get(News.class, 21); 48 System.out.println(news); 49 session.flush(); 50 News news2 = (News)session.get(News.class, 21); 51 System.out.println(news2); 52 53 System.out.println(news == news2);//true 54 } 55 56 /** 57 * flush:使数据库表中的记录和Session缓存中的对象的状态保持一致。为了保持一致,则可能会发送对应的SQL语句。 58 * 1.在Transaction的commit()方法中:先调用session的flush方法,再提交事务 59 * 2.flush()方法可能会发送SQL语句,但不会提交事务 60 * 3.注意:在为提交事务或显示调用session.flush()方法 之前,也有可能会flush()操作。 61 * 1).执行HQL或QBC查询,会先进行flush操作,以得到数据表的最新纪录 62 * 2).若记录的ID是由底层数据库使用自增的方式生成的,则在调用save方法时,就会立即发送INSERT语句 63 * 因为save方法后,必须保证对象的ID是存在的! 64 */ 65 @Test 66 public void testFlush2() { 67 News news = new News("Hibernate", "oracle", new Date()); 68 session.save(news); 69 } 70 71 @Test 72 public void testFlush() { 73 News news = (News)session.get(News.class, 21); 74 news.setAuthor("Bruce Eckel"); 75 76 News news2 = (News)session.createCriteria(News.class).uniqueResult(); 77 System.out.println(news2); 78 } 79 80 /** 81 * refresh():会强制发送SELECT 语句,以使Session缓存中对象的状态和数据表中对应的记录保持一致! 82 */ 83 @Test 84 public void testRefresh() { 85 News news = (News) session.get(News.class, 21); 86 System.out.println(news); 87 session.refresh(news); 88 System.out.println(news); 89 } 90 91 /** 92 * clear():清理缓存 93 */ 94 @Test 95 public void testClear() { 96 News news1 = (News) session.get(News.class, 21); 97 session.clear(); 98 News news2 = (News) session.get(News.class, 21); 99 } 100 }