当然我最后还得debug了一下 Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from Person person0_ where person0_.pid=? nan 很明显这个person在session 关闭之后依旧存在,所以只向数据库进行一条插入语句,没有随着缓存的消失而不见。 问题很明显了,缓存是随着session消失而消失的,缓存中的内容则不会随着缓存消失而消失。
当然我最后还得debug了一下
Hibernate: select person0_.pid as pid0_0_, person0_.pname as pname0_0_, person0_.psex as psex0_0_ from Person person0_ where person0_.pid=?
nan
很明显这个person在session 关闭之后依旧存在,所以只向数据库进行一条插入语句,没有随着缓存的消失而不见。
问题很明显了,缓存是随着session消失而消失的,缓存中的内容则不会随着缓存消失而消失。
抛开hibernate不说,什么是缓存?是一种为了提高数据读取效率的一种介质。是介质,缓存的数据是拷贝而来的。你明白了这一点,再给你说你第二个问题,
Person p1 =(Person)session.get(Person.class, 1L);
这句代码,直接就持久化了p1对象,就是说执行了SQL查询,很明显你还没理解持久化的概念,
说白了,持久化就是数据库有,sesison缓存也有。
你已经用一个实体对象p1接受了你查询的对象,那么你下面打印当然有东西,你system语句打印的又不是你缓存的东西,可以说和你的缓存毫无关系啊。缓存本身就是拷贝来的数据,你打印的是你持久化的对象,二者毫不相干,明白了吧。