package com.rlovep.cache; import java.util.List; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.Test; public class AppCache { private static SessionFactory sf=null; static{ Configuration config=new Configuration().configure().addClass(User.class); //创建serviceRegistry 代替buildSessionFactory()方法 ServiceRegistry serviceRegistry =new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry(); // 创建session的工厂对象 sf = config.buildSessionFactory(serviceRegistry); } /** * * @Title: testStatus * @Description: 测试对象的三种状态 * @return:void * @throws * @author peace w_peace@163.com */ @Test public void testStatus(){ Session session = sf.openSession(); Transaction tx = session.beginTransaction(); User user=new User();//new 出了的对象,临时状态 user.setUserName("peace");//与数据库没有关联 //保存到数据库: session.save(user);//调用save使对象持久化 user.setUserName("peace5");//会改变到数据库 //查询 User user2 = (User) session.get(User.class, 3);//get到的是持久化状态 user2.setUserName("peace4");//会改变到数据库 tx.commit(); session.close(); //关掉后属于游离状态 user.setUserName("peace6");//游离状态不会显示到数据库;条状到持久化状态只需要执行update,save之类的语句即可 } /** * * @Title: testCache * @Description: 测试一级缓存 * @return:void * @throws * @author peace w_peace@163.com */ @Test public void testCache(){ //创建两个session Session session = sf.openSession(); Transaction tx = session.beginTransaction(); Session session2 = sf.openSession(); Transaction tx2 = session2.beginTransaction(); //获得一个user对象,会查询数据库 User user=(User)session.get(User.class, 2); //使用同一个session再次获得一次,不会查询数据库,直接从一级缓存中获取,也叫session缓存 user=(User)session.get(User.class, 2); //使用不能的session获得同一对象,会查询数据库,说明不同的session不公用缓存 User user2=(User)session2.get(User.class, 2); //将session1中的缓存user放入session2中,并执行更新 session2.update(user); //修该对象 user.setUserName("ppp");//会执行两条update语句 tx2.commit(); tx.commit(); session2.close(); session.close(); } /** * * @Title: testFlush * @Description: 测试刷新 * @return:void * @throws * @author peace w_peace@163.com */ @Test public void testFlush(){ Session session = sf.openSession(); Transaction tx = session.beginTransaction(); User user=null; user=(User)session.get(User.class, 2); user.setUserName("rong"); //缓存数据与数据库同步session.createSQLQuery(sql).uniqueResult(); session.flush();//注意flush只是与数据库缓存同步,没有提交到数据库。数据中是没有内容的; //使用flush刷新后,可以直接进行sql查询获得值;假如没有执行刷新,获得的将不是最新值; SQLQuery query = session.createSQLQuery("select * from User where userId=2"); query.addEntity(User.class); List<User> list = query.list(); System.out.println(list.get(0).getUserName()); //tx.commit(); 该方法会调用flush session.close(); } @Test public void testClear(){ Session session = sf.openSession(); Transaction tx = session.beginTransaction(); User user=null; user=(User)session.get(User.class, 2); //session.clear();//清空所有,会使user指向的对象变为游离状态 session.evict(user);//清除指定对象,会使user指向的对象变为游离状态 user=(User)session.get(User.class, 2);//会再次执行一次查询语句 tx.commit(); //该方法会调用flush session.close(); } }