关键代码:
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); } }