Hibernate的三种状态
1、瞬时状态 : 由 new 操作符创建,且尚未与Hibernate Session 关联的对象是瞬时的` ,如果没有被使用,还会被gc回收:
//瞬时状态
RoleEntity r=new RoleEntity();
r.setRoleName("教师");`
2、持久状态 ---->内存中存在,数据库中也存在,在相关联的Session的作用范围内,是持久状态的,在修改持久状态的时候,不会去立即同步数据库,会先放入到一级缓存,当我们提交事务的时候, hibernate会自动执行update,把缓存与数据库同步
Transaction tr= session.getTransaction();
tr.begin();
/***持久状态**/
session.save(r);
//操作持久状态
r.setRoleName("学生");
tr.commit();
/***持久状态**/
session.close();
3、游离状态------>在内存中存在,在数据库中不一定存在,在相关联的Session的关闭后,当与新的Session的关联后,又会变成的持久状态
Hibernate的缓存
1、默认支持一级缓存,一级缓存是session级别,可以减少访问数据库的次数
2、可插拨式的缓存,二级缓存,二级缓存是sessionFactory 级别的缓存
@Test
public void load(){
RoleEntity roleEntity= session.load(RoleEntity.class,"4028808e70e654ea0170e654f12b0000");
//因为使用的是loa方法其实是将roleEntity放在一级缓存Session当中,并未执行sql语句,而当在调用对象属性的时候才执行sql语句,去查询数据库
System.out.println("session关闭之前"+roleEntity.getRoleName());
//一级缓存
session.close();
//一级缓存关闭,roleEntity.getRoleName是在内存中提取到
System.out.println("session关闭之后"+roleEntity.getRoleName());
}
@Test
public void load(){
RoleEntity roleEntity= session.load(RoleEntity.class,"4028808e70e654ea0170e654f12b0000");
//System.out.println("session关闭之前"+roleEntity.getRoleName());
//一级缓存
session.close();
//一级缓存关闭,此时执行则会抛出noSession的错误,不再与数据库有连接
System.out.println("session关闭之后"+roleEntity.getRoleName());
}
懒加载,急加载
1.什么是懒加载,什么是急记载,如何使用?
懒加载就是延迟加载,急记载就是立即加载
load方法支持懒加载,,get方法支持急加载
2.懒加载和急加载的区别?
懒加载就是load方法,对象先放在一级缓存当中,当要调用对象属性的时候,才会去连接数据库进行操作,然后将查出来的数据存放到一级缓存中,但Session关闭时,当Session关闭时,继续操作对象属性就会抛出noSession的错误,因为不再与数据库有连接
急记载就是get方法,马上查询数据库,然后将查出来的数据存放当一级缓存中,即使Session关闭,依然可以获得数据,因为数据存放到内存当中