Hibernate session.flush() 使用

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

flush: Session 按照缓存中对象属性变化来同步更新数据库。

默认情况下,Session 会在以下情况下调用 flush:

1. 直接调用 session.flush。

2. 当应用调用Transaction.commit() 时, 会先调用 flush, 然后再向数据路提交。

3. 在做查询时(HQL, Criteria),如果缓存中持久化对象的属性发生变化,会先 flush 缓存,以保证查询结果是最新的数据。

flush 缓存的例外情况:如果对象使用native 生成器生成 ID 时,在当调用session.save() 去保存对象时, 会直接向数据库插入该实体的 insert 语句。

flush 的五种 FlushModel :

1、NEVEL:已经废弃了,被MANUAL取代了
2 MANUAL:
如果FlushMode是MANUAL或NEVEL,在操作过程中Hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误
org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove ‘readOnly‘ marker from transaction definition;
解决办法:配置事务, Spring会读取事务中的各种配置来覆盖hibernate的session中的FlushMode;
3 AUTO
设置成auto之后,当程序进行查询、提交事务或者调用session.flush()的时候,都会使缓存和数据库进行同步,也就是刷新数据库
4 COMMIT
提交事务或者session.flush()时,刷新数据库;查询不刷新
5 ALWAYS:
每次进行查询、提交事务、session.flush()的时候都会刷数据库

ALWAYS和AUTO的区别:当hibernate缓存中的对象被改动之后,会被标记为脏数据(即与数据库不同步了)。当 session设置为FlushMode.AUTO时,hibernate在进行查询的时候会判断缓存中的数据是否为脏数据,是则刷数据库,不是则不刷,而always是直接刷新,不进行任何判断。很显然auto比always要高效得多。

如果session 中的某个类的属性发生了改变,使用flush() 方式,去更改数据库中的记录,使其和改变后的session 中的对象一致

session.commit 和 session.flush 区别:

session.flush: 执行 一列 sql,但是不提交

session.commit: 会先执行 flush,然后提交事务,提交事务意味着对数据库的操作永久保存,不可rollback。

时间: 2024-08-04 10:16:03

Hibernate session.flush() 使用的相关文章

Hibernate session flush

最近做项目时,用到了hibernnate,批量删除10000条数据时,删除时前台将id传到后台,用in匹配去删除,页面直接卡死. 解决方法,将传过来的10000条id分批删除,每删除五百条后,调用getCurrentSession().flush.问题的到解决 以下资料是涉及flush参考.值得学习, 注意flush后,并没有提交事务,一样可以回滚,参考第一个链接即可 http://blog.csdn.net/bzhang19841212/article/details/2167290 http

Hibernate session缓存

一级缓存(执行代码时查看console台上的sql语句)  清空缓存 @Test public void demo03(){ //清空缓存 Session session=factory.openSession(); session.beginTransaction(); //1.查询 User user = (User)session.get(User.class, 1); System.out.println(user); //session.evitc(user) //将执行对象从一级缓存

hibernate session method

import static org.junit.Assert.*; import java.io.FileInputStream; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate

hibernateTemplate 与 hibernate session save 保存数据不一样

@Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext( "spring_dao.xml"); SessionFactory sessionfactory = (SessionFactory) ac .getBean("sessionfactory"); Company cp = new Company(); cp.setCompany_name(&q

Hibernate session FlushMode

Hibernate session FlushMode有五种属性: 1.NEVEL:已经废弃了,被MANUAL取代了 2 MANUAL: 如果FlushMode是MANUAL或NEVEL,在操作过程中hibernate会将事务设置为readonly,所以在增加.删除或修改操作过程中会出现如下错误 org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-

Hibernate Session & Transaction详解

Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API, 注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之与Hibernate,相当于JDBC Connection相对与JDBC. Session对象是有生命周期的,它以Transaction对象的事务开始和结束边界

hibernate session.get(class,serialid) 方法为空值的原因?

package hibernate.test; import hibernate.test.pojo.Person; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; impo

hibernate session问题大总结

openSessionInView的作用! OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的.由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad

Hibernage错误:Could not open Hibernate Session for transaction

今天在做SSH框架整合的时候碰到的这个问题,在测试service层的时候程序正常运行,但是添加Struts,在action层测试的时候提示了如下问题:Could not open Hibernate Session for transaction.大概意思就是数据库连接超时. 解决方法如下: 在spring的配置文件中添加如下配置 给sessionFactory的bean添加如下配置 <bean id="sessionFactory" class="org.spring