Session session = SQLHelper.openSession();
//一级缓存-》session
users user1 = (users)session.get(users.class, 2);
users user2 = (users)session.get(users.class, 2);
users user3 = (users)session.get(users.class, 2);
//清除缓存中的对象
session.evict(user1);
//清除整个缓存
session.clear();
System.out.println(user1.getUname());
System.out.println(user2.getUname());
System.out.println(user3.getUname());
SQLHelper.closeSession(session);
为什么还能打印出来user1对象的信息啊

解决方案 »

  1.   

    清除的是缓存里的缓存
    user1是users的对象,和session没关系了
      

  2.   

    users user1 = (users)session.get(users.class, 2); //当session里面没有id号为2 的Users对象时才会去加载,有的话直接然后那个代理对象
    //因为上面一条语句命使session里面存在id号为2 的Users对象,所以以下两个都是返回代理对象,没有从数据库中查询
    users user2 = (users)session.get(users.class, 2); 
    users user3 = (users)session.get(users.class, 2); session.evict(user1); //只是 表示清空session里面id号为2 的Users对象,缓存里面不存在这个对象
    这个时候如果使用如下语句又会又数据库中查询,因为session里面已经不存在Users对象
    users user4 = (users)session.get(users.class, 2); session.evict(user1); //这句虽然是清空session里面user1对象,但user1的引用的对象并没有销毁
      

  3.   

    楼主对Hibernate的缓存机制好像不是很清楚!关于Hibernate的缓存和CRUD   hibernate缓存机制