hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别


首先session是有一级缓存的,目的是为了减少查询数据库的时间,提高效率,一级缓存的生命周期和session是一样的,

session.flush()和session.clear()就针对session的一级缓存的处理。

简单的说,

1 session.flush()的作用就是将session的缓存中的数据与数据库同步。

2 session.clear()的作用就是清除session中的缓存数据(不管缓存与数据库的同步)。

3.session.refresh():会强制发送select语句,以使session缓存中对象的状态和数据表中对应的记录保持一致。该方法的有效性需要配置事务的隔离级别为read commited(读已提交)。

注意:

执行完session.flush()时,并不意味着数据就肯定持久化到数据库中的,因为事务控制着数据库,如果事务提交失败了,缓存中的数据还是照样会被回滚的。

举例:

@Test   
    public void testFlush(){  
        Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
        session.beginTransaction();  
        Teacher t = (Teacher) session.get(Teacher.class, 3);  
        t.setName("yyy");  

        t.setName("yyyyy");  
        session.getTransaction().commit();  
    }

看这段代码,我们setName() 2次, 但程序只会更改数据库一次,在commit时。

@Test    
    public void testFlush(){  
        Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
        session.beginTransaction();  
        Teacher t = (Teacher) session.get(Teacher.class, 3);  
        t.setName("yyy");  
        session.flush();//有flush会执行2次UPDAE,没有会只执行一次  
        t.setName("yyyyy");  
        session.getTransaction().commit();  
    }

我们在第2次setName()时 执行session.flush().

再看hibernate 执行的sql 语句

Hibernate:   
    update  
        Teacher   
    set  
        birthday=?,  
        name=?,  
        title=?   
    where  
        id=?  
Hibernate:   
    update  
        Teacher   
    set  
        birthday=?,  
        name=?,  
        title=?   
    where  
        id=?

执行了2次Update

所以看出来flush方法会强制与数据库同步。


原文链接:https://www.cnblogs.com/baizhanshi/p/7685398.html