Hibernate一级缓存

 

一级缓存有三个常用的操作,分别为刷出、清除和刷新。

1、刷出(flush)

在调用Session的flush()方法时,会执行刷出缓存的操作,接下来通过具体示例来演示一级缓存的刷出功能。

@Test
	public void testFlush() {
		
		Session session = HibernateUtils.openSession();
		
		session.beginTransaction();
		
		Customer customer = session.get(Customer.class, 1);
		customer.setName("WE");
		
		session.flush();
			
		session.getTransaction().commit();
	
        session.close();	
	}

在session.flush()方法前设置断点,用debug方式执行程序,当执行完该方法代码时控制台会输出update语句。

                 

我们记得在事务提交commit()方法时也发送了update语句,这是因为在提交事务前,程序会默认执行flush()方法,这就是一级缓存的刷出操作。

2、清除(clear)

调用Session的clear()方法时、可以执行清除缓存的操作,接下来,通过具体示例来演示一级缓存的清除功能。

@Test
	public void testFlush() {
		
		Session session = HibernateUtils.openSession();
		
		session.beginTransaction();
		
		Customer customer = session.get(Customer.class, 1);
		
		System.out.println(customer);
		
		customer.setName("OMG");
		
		session.clear();
		
		session.getTransaction().commit();
		session.close();
	}

运行结果如下:

从图可见,控制台只输出了查询语句,没有输出update语句,数据库也没有发生变化。这是因为在执行clear()语句时,清空了一级缓存内的数据,所以book对象的修改操作没有生效。如果 把上述代码的sesson.clear()方法换为session.evict(customer)方法也可以实现同样效果,evict()方法用于实现清除一级缓存中的某个对象。

3、刷新(refresh)

调用Session的refresh()方法时,可以重新查询数据库,更新Hibernate快照区和一级缓存。

@Test
	public void testFlush() {
		
		Session session = HibernateUtils.openSession();
		
		session.beginTransaction();
		
		Customer customer = session.get(Customer.class, 1);
		
		System.out.println(customer);
		
		customer.setName("LGD");
		
		System.out.println(customer);
		
		session.refresh(customer);
		
		System.out.println(customer);
		
		session.getTransaction().commit();
		session.close();
	}

运行结果为:

程序执行完毕后,数据库不会发生改变。

相关文章

相关标签/搜索