关键代码:

flush():将缓存中的数据写入到数据库中。

refresh():将数据库中的数据写入到缓存。

clear():清除缓存。


代码片段:

package com.shuoeasy.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;


/**
 * Unit test for simple App.
 */
public class AppTest {
	Session session;
	SessionFactory sf;

	@Before
	public void init() {

		Configuration conf = new Configuration().configure();

		ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();

		sf = conf.buildSessionFactory((org.hibernate.service.ServiceRegistry) sr);

		session = sf.openSession();

		session.beginTransaction();
		System.out.println("init");
	}

	@After
	public void destory() {
		session.getTransaction().commit();

		session.close();

		sf.close();
		System.out.println("dectory");
	}

	/**
	 * session缓存只会出现一条sql,news1/news2的值一致
	 * 
	 */
	@Test
	public void testSessuibCacge() {
		News news1 = (News) session.get(News.class, 1);
		System.out.println(news1);
		
		News news2 = (News) session.get(News.class, 1);
		System.out.println(news2);
	}
	
	/**
	 * 一般情况下session的缓存被更改后,会自动更改数据库
	 */
	@Test
	public void testSessionFlush(){
		/*
		// hibernate在commit之前会调用flush方法进行刷新
		News news1 = (News) session.get(News.class, 1);
		news1.setTitle("标题2");
		System.out.println(news1);
		*/
		
		// 也可以手动调用flush()
		News news1 = (News) session.get(News.class, 1);
		news1.setTitle("标题2");
		session.flush();
		System.out.println(news1);
		 
	}
	
	/**
	 * 例外:如果记录的id是用底层数据库使用自增方式生成的,则在save()
	 * 方法后立即插入数据(方便框架获取id)
	 */
	@Test
	public void testSessionFlush2(){
		News news = new News("标题","内容");
		
		session.save(news);
	}
	
	/**
	 * 强制查询数据库,将记录更新到缓存中
	 */
	@Test
	public void testRefresh(){
		News news = (News)session.get(News.class, 1);
		session.refresh(news);
		System.out.println(news);
	}
	
	/**
	 * 清除缓存
	 */
	@Test
	public void testClear(){
		News news = (News)session.get(News.class, 1);
		System.out.println(news);
		session.clear();
	    news = (News)session.get(News.class, 1); // 缓存没了,要重新查一次数据库
		System.out.println(news);
	}
	
}


你可能感兴趣的文章