Hibernate中的一级缓存(session缓存)的本质是什么

问题:
1:Hibernate中的一级缓存(session缓存)的本质是什么(底层是什么类型,怎样存储数据的,副本是怎么实现的,实体对象的标识符的作用)

代码:
/**查看session的本质是什么
* 在什么时候加进session的一级缓存的
* @author pc
*
*/
public class HibernateSessionTest {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
@Test
public void testname(){
final Session session = sessionFactory.openSession();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(1000);
int count = session.getStatistics().getEntityCount();
System.out.println(count);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
Transaction transaction = session.beginTransaction();
session.save(new ElecText("gg","ll",new Date()) );
transaction.commit();
}
}


创建一个新的线程一直在查看session缓存中缓存的个数,经过调试得出,在Hibernate源码中的、
public class StatefulPersistenceContext implements PersistenceContext {
// Identity map of EntityEntry instances, by the entity instance
private Map entityEntries;
}类中找到了session一级缓存的本质:就是entityEntries成员变量,类型为Map的子类IdentityMap


总结: session缓存(一级缓存的实际类型是IdentityMap,是StatefulPersisitenceContext中的成员变量entityEntries),副本是在entityEntries.put(entity , e)中的 v 值e 类型为EntityEntry, k值为实例对象,实例对象唯一,拿到的对相应的副本也是唯一,标识符即:Hibernate为实例对象生成的主键值(生成的策略在hbm映射文件中手动配置例如<id name="textID"> <generator class="uuid"></generator> </id>),标识符作用,当一个对象放在session缓存中的时候,根据标识符是否存在类决策发送insert(没有标识符)或update(存在标识符并且entity(持久化对象)和e(e是副本不会变化的)对应的属性值发生了变化)语句