一 hibernate有两级缓存
一级缓存:默认就是打开的;使用范围是从session创建到session关闭,存储的数据必须是持久态。
二级缓存:目前已经不再使用,被redis代替,使用范围是SessionFactory的范围,默认不是打开的。
使用一级缓存插叙的过程:查询数据时,先查询一级缓存,如果没有发现没有要找的数据,采取查询数据库,再将查询到的数据放回到一级缓存中。
一级缓存执行的过程:在一级缓存中存在两个区域,一个是一级缓存区,一个是一级缓存区的快照区(副本区)。
User user = session.get(User.class,7); 语句执行后所做的操作是:先去一级缓存区去查找数据,如果没有要查询的数据,则去数据库查找,将找到的数据存放在一级缓存中,在快照区也同时再存一份。
user.SetUserName("东方不败"); 语句执行后所做的操作是:修改user对象的值,修改持久对象的值,同时修改一级缓存中值,不会修改快快照区的值。最后提交事物,先比较一下一级缓存的内容和快照区的内容是否相同。如果相同不会更新数据库,如果不同,则会将一级缓存中的内容更新到数据库中
二 实体对象类的状态
(1)瞬时态:对象里面没有ID,与session也没有联系。
(2)持久态:对象里面有ID值,与session有关联。
(3)托管态:对象有ID,与session没有关联。
三 hibernate绑定本地线程session,不需要手动关闭session
(1)在核心配置文件中配置如下代码:
<property name="hibernate.current_session_context_class">thread</property>
代码如下:
public class HibernateUtils {
private static Configuration cfg = null;
private static SessionFactory sessionFactory =null;
static{
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
public static Session getSession()
{
return sessionFactory.getCurrentSession();
}
@Test
public void queryTest()
{
Session session = HibernateUtils.getSession();
Transaction ts = session.beginTransaction();
Query query = session.createQuery("from User");
List<User> list = query.list();
ts.commit();
for(User user :list)
System.out.println(user);
}