/*

spring集成了hibernate,在xml中配置数据源等信息。现在测试,什么时候更新hibernate的一级缓存。

*/

@Test
public void testHibernate(){

//加载配置文件

ApplicationContext ac=new ClassPathXmlApplicationContext("/spring-hibernate.xml");

//获取SessionFactory
SessionFactory sf = (SessionFactory) ac.getBean("sessionFactory");
Session session = sf.openSession();
session.clear();

//通过get方法获取实体类
PubUsers pu = (PubUsers) session.get(PubUsers.class, 15);
System.out.println("username : = " + pu.getUserAccount());
Transaction tx = session.beginTransaction();

//通过这两种方式不会更新session缓存中的实体对象
// session.createSQLQuery("update sshms.pub_users t set t.user_account='test_5' where t.user_id=15").executeUpdate();
// session.createQuery("update PubUsers t set t.userAccount='test_4' where t.userId=15").executeUpdate();


pu.setUserAccount("test");
pu.setEnabled(1);
pu.setIssys(1);
pu.setUserDesc("营业员");
pu.setUserPassword("1");
//使用update 的时候会更新一级缓存中的数据。需要再缓存中取出数据再修改属性值,直接new一个对象会抛异常:
//a different object with the same identifier value was already associated with the session

//通过save update会更新缓存中的实体类对象
session.update(pu);
tx.commit();
PubUsers pu2 = (PubUsers) session.get(PubUsers.class, 15);
System.out.println("username2 : = " + pu2.getUserAccount());

Iterator<PubUsers> it = session.createQuery("from PubUsers t where t.userId=15").iterate();
if(it.hasNext()){
System.out.println("iterate username: = " + it.next().getUserAccount());
}

List<PubUsers> its = session.createQuery("from PubUsers t where t.userId=15").list();
if(its.size() > 0){
System.out.println("list username: = " + its.get(0).getUserAccount());
}


session.close();
sf.close();

}

 

关于hibernate缓存的一些信息:

1、get方法。第一次使用get方法,从数据库中获取数据,会将实体类对象存入一级缓存中。下次再通过get获取对象时,会先检查一级缓存中有没有,如果没有(如果配置二级缓存,会去二级缓存中查找),会查询数据库。

2、load方法。它可以配置延迟加载。如果lazy=true,它会首先返回一个代理对象,当用到对象属性的时候,才会去根据id,去缓存中查找,如果缓存中没有,再去数据库中查找。如果lazy=false,和get方法一样。

3、list方法。它不会使用二级缓存,会使用一级缓存,一级缓存中没有,会直接查询查询数据库,发出N条sql语句。

4、iterate方法。它使用一级,二级缓存,它会先执行一条sql查询所有数据的id,再根据id去缓存中查找有没有实体类对象,如果没有,就会去数据库中查找,会出现n+1条sql语句的现象。

一级缓存也就是session缓存,生命周期随着session关闭,缓存消失。二级缓存,是sessionFacory缓存,进程级缓存,除非重启服务时,缓存才会消失。一般不会变动的数据才存到二级缓存...

 

posted on 2016-07-07 14:05  zyb_java  阅读(178)  评论(0编辑  收藏  举报