[转载]session.flush()

转载 2007年09月25日 11:00:00
hibernate一个Session有一个Cache,cache屏蔽了应用程序直接去访问数据库,如果同一张table的同一row在先前已经被请求过,那么为何下次请求的时候还要去请求一次呢,把前面的cache住,再遇到这样的请求直接返回cache里边的即可。

cache 里边的数据如果含有脏数据,需要跟数据库同步(也就是需要hibernate来发送update, delete, insert),调用session.flush()达到此目的。一般情况下,hibernate在一个tx.commit()的时候会自动调用 session.flush();也可以应用程序手动调用session.flush()来立刻将session的脏数据提交。
Session session = HibernateSessionFactory.currentSession();
        Transaction tx = session.beginTransaction();
        try{
         Employee employee1 
= (Employee)session.load(Employee.class, new Integer(3));
         System.out.println(employee1);
         employee1.setAge((byte)98);
         session.flush();//发送employee1的update给数据库
//         employee1.setAge((byte)43);
         tx.commit();//employee1已经被flush过,不会再被flush。如果把上面以行代码注释取消,还会再发一条update语句。
        }
        catch(HibernateException e){
            e.printStackTrace()
;
            tx.rollback();
        }

         tx 
= session.beginTransaction();
        Employee employee2 = (Employee) session.load(Employee.class, new Integer(3));
        employee2.setGender('f');
        System.out.println(employee2);
        tx.commit();

session.flush()的动作执行的时候,session中cache不会被清空,所以上面的employee2和employee1返回的还是同一个实例。

那些被flush()过的对象不会在下次flush()的时候再被flush()一次,除非两次flush()中间又产生了新的脏数据。

我 认为应用程序基本上不需要显示去调用session.flush();而交给tx.commit()去做就可以了。原因是:手动调用 session.flush()虽然是往数据库提交了update等sql语句,但是这些update真正的commit是在tx.commit()执行 的时候。所以手动session.flush()后,其他的session或者是其他的应用程序看到的仍然还是数据库以前的数据。(可以试验)

相关文章推荐

Hibernate的Session_flush与隔离级别

我们先来看一些概念: 1.脏读:脏读又称为

session.flush()的使用

session flush在commit之前默认都会执行他。也可以手动执行它,他主要做了两件事: 1) 清理缓存。 2) 执行SQL。 session在什么情况下执行flush * 默认在...

flush与session的内部执行的过程详解

1.当主键生成策略是uuid的时候的情况 (这时候save的时候,不会发出sql的语句) : User1 user = new User1(); user.setName("李四"); ...

Hibernate深入理解----03操作Session缓存方法(flush、refresh、clear,事务隔离级别)

参考代码下载github:https://github.com/changwensir/java-ee/tree/master/hibernate4     Session 接口是 Hibernat...

Hibernate的session.flush做了什么呢?

Hibernate的session.flush做了什么呢?(转) 这是在一次事务提交时遇到的异常。     an assertion failure occured (this may ind...

org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Session after a

1、错误描述org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Session a...

Hibernate 中的session 的flush、reflush 和clear 方法 ,及数据库的隔离级别

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. flush 方法: 说白一点:如果session 中的某...

Hibernate---->session flush方法

session flush方法 1、session flush方法主要做了两件事:   * 清理缓存   * 执行sql 2、session在什么情况下执行flush   * 默认在事务提交...

Hibernate Session的Flush模式

首先要知道的是: Hibernate会尽量将与数据库的操作延迟,直到必须要与数据库进行交互,例如save方法一般会在提交时才真正执行,最终在提交时会以批处理的方式与数据库进行交互,以提高效率。 而...

Hibernate的session.flush做了什么呢【2】

前面简单的介绍了一下Hibernate的flush机制和对我们程序可能带来的影响以及相应的解决方法,Hibernate的缓存机制还会在其他的方面给我们的程序带来一些意想不到的影响。看下面的例子: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[转载]session.flush()
举报原因:
原因补充:

(最多只允许输入30个字)