Hibernate commit() 和flush() 的区别

<<精通Hibernate java对象持久化技术详解>> ,flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来

  • 所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库
  • Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.
  • commit针对事物的
  • flush针对缓存的
  • 同步到数据库中后只要没有commit还是可以rollback的

1、session在什么情况下清理缓存: * 默认情况下,当应用程序提交事务,

  如:Transaction.commit; * 当我们显示调用flush的时候 * 在执行某些查询的时候,如:iterate

2、session.flush()主要完成两件事情: * 清理缓存 * 执行sql

3、flush执行的顺序:hibernate按照save,update,delete顺序提交相关操作

commit()和事务相关。执行时会先隐式调用flush()方法,再提交事务。执行之后无法rollback()进行回滚。

 public void testSave1() {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   User1 user = new User1();
   user.setName("李四");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());

   //因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理
   //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false
   session.save(user);

   //调用flush,hibernate会清理缓存,执行sql
   //如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据
   //并且session中existsInDatebase状态为true
   session.flush();

   //提交事务
   //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush
   //commit后数据是无法回滚的
   tx.commit();
  }catch(Exception e) {
   e.printStackTrace();
   tx.rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }

 public void testSave2() {
  Session session = null;
  Transaction tx = null;
  try {
   session = HibernateUtils.getSession();
   tx = session.beginTransaction();
   User2 user = new User2();
   user.setName("张三1");
   user.setPassword("123");
   user.setCreateTime(new Date());
   user.setExpireTime(new Date());

   //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id
   //纳入了session的管理,修改了session中existsInDatebase状态为true
   //如果数据库的隔离级别设置为未提交读,那么我们可以看到save过的数据
   session.save(user);

   tx.commit();
  }catch(Exception e) {
   e.printStackTrace();
   tx.rollback();
  }finally {
   HibernateUtils.closeSession(session);
  }
 }
时间: 2024-12-16 11:14:27

Hibernate commit() 和flush() 的区别的相关文章

FragmentTransaction的commit和commitAllowingStateLoss的区别

1.什么是FragmentTransaction? 使用Fragment时,可以通过用户交互来执行一些动作,比如增加.移除.替换等. 所有这些改变构成一个集合,这个集合被叫做一个transaction. 可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作. 可以这样得到FragmentTransaction类的实例: Fragm

转: Oracle Form 中commit 与do_key(&#39;commit_form&#39;)区别

1.commit_form针对form上面的数据变动进行commit,对于代码中的类似update,insert语句也进行提交:如果form上面的数据变动和代码中的数据变动有冲突,最后以界面上的为准.2.do_key('commit_form')会首先寻找form下的triggers中的KEY-COMMIT这个trigger,并执行KEY-COMMIT中所写的代码.如果没有KEY-COMMIT这个trigger,则会针对form和代码一起提交.如果form上面的数据变动和代码中的数据变动有冲突,

hibernate session 之flush 和commit 的区别

flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来 所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库 Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持

hibernate get和load的区别

区别主要有三点: 1,load返回的是代理对象,等到真正使用对象的内容时才会发出sql语句. 2,get直接从数据库加载,不会延迟. 3,不存在对应记录时表现不一样. 无论是get还是load,都会首先查找缓存(一级缓存),如果没有才会去数据库查找.调用clear()方法可以清除session缓存,调用flush()方法可以强制进行从内存到数据库的同步. 具体分析如下: 在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就

hibernate中get和load区别

在日常开发中,获取数据时必不可少的,这样就要用到get和load方法来实现了.下面简单说一下get和load的区别. 1.返回值不同 使用get方法检索数据时,没有该数据返回值为null. 而使用load方法时,则返回org.hibernate.ObjectNotFoundException异常,如下: 2.检索机制不同 get方法和find方法都是直接从数据库中检索 而load方法的执行则比较复杂首先查找session的persistent Context中是否有缓存,如果有则直接返回 如果没

hibernate跟Mybatis/ ibatis 的区别,为什么选择?(转)

第一章 Hibernate与MyBatisHibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的一个子项目. 1.1 Hibernate 简介Hibernate对数据库结构提供了较为完整的封装,Hibernate的O/R Mapping实现了POJO 和数据库表之间的映射,以及SQL 的自动生成和执行.程序员往往只需定义好了POJO 到数据库表的映射关

Hibernate getCurrentSession()和openSession()的区别

通过getCurrentSession()创建的Session会绑定到当前线程上:openSession()不会. 通过getCurrentSession()获取Session,首先是从当前上下文中寻找旧的Session,如果没有,则创建新的Session:而openSession()是每次都创建新的Session. getCurrentSession()创建的Session在事物提交时自动关闭:openSession()创建的Session需要手动关闭. 1 @Test 2 public vo

具体问题:3、hibernate跟Mybatis/ ibatis 的区别,为什么选择?

第一章     Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的一个子项目. MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html Hibernate参考资料: http://docs.jboss.org/hibernate/core/3.6/refe

jdbc,mybatis,hibernate各自有优缺点以及区别

JDBC: 我们平时使用jdbc进行编程,大致需要下面几个步骤: 1,使用jdbc编程需要连接数据库,注册驱动和数据库信息 2,操作Connection,打开Statement对象 3,通过Statement对象执行SQL,返回结果到ResultSet对象 4,使用ResultSet读取数据,然后通过代码转化为具体的POJO对象 5,关闭数据库相关的资源 jdbc的缺点: 一:工作量比较大,需要连接,然后处理jdbc底层事务,处理数据类型,还需要操作Connection,Statement对象和