Hibernate的clear(),flush(),evict()方法详解

来源:互联网 发布:看耽美的软件 编辑:程序博客网 时间:2024/05/16 12:41

1.Clear 方法

      无论是Load 还是 Get 都会首先查找缓存(一级缓存) 如果没有,才会去数据库查找,调用Clear() 方法,可以强制清除Session缓存。

例:

public void testClear(){
        Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher) session.get(Teacher.class, 3);
        System.out.println(t.getName());
        Teacher t2 = (Teacher) session.get(Teacher.class, 3);
        System.out.println(t2.getName());
        session.getTransaction().commit();
    }

这里虽然用了2  get 方法( get 方法会立即执行 sql 语句),但因为第一次执行了会缓存一个 ID  3 的实体,所以虽然有 2  get 方法只执行一次 SQL 语句。

 

这里在第2  get 前执行 session.clear(), 我们把 hibernate show_sql  出来,它就会执行 2  sql 语句了。 所以session.clear() 会清除缓存。

 

2.Flush方法

      可以强制进行从内存到数据库的同步。

public void testClear(){
        Session session =  HibernateUitl.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        Teacher t = (Teacher) session.get(Teacher.class, 3);
        System.out.println(t.getName());
        session.clear();//这里不clear只会执行一次sql语句,有clear会执行2次
        Teacher t2 = (Teacher) session.get(Teacher.class, 3);
        System.out.println(t2.getName());
        session.getTransaction().commit();
    }

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

 @Test
    /**
     * flush 强制与数据库同步
     */
    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();
    }

我们在第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 方法会强制与数据库同步。

Flush方法是可以设置的,也就是 fulsh 什么时候执行是可以设置的

 在session.beginTransaction 前设置 FlushMode

session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)

FlushMode 5 个值可选

Always:任何代码都会 Flush 
AUTO:默认方式 – 自动 
Commit:COMMIT 
Never:始终不 
MANUAL:手动方式


设置FlushMode  有个好处是可以节省开销,比如默认 session 只做查询时,就可以不让他与数据库同步了。


原创粉丝点击