hibernate中的session.flush()和commit()的区别

来源:互联网 发布:python np.split函数 编辑:程序博客网 时间:2024/05/20 15:40

       1、flush()方法进行清理缓存的操作,执行一系列的SQL语句,但不会提交事务;commit()方法会先调用flush()方法,然后提交事务. 提交事务意味着对数据库所做的更新会永久保持下来   所谓清理,是指Hibernate 按照持久化象的状态来同步更新数据库   


       2、Flush()后只是将Hibernate缓存中的数据提交到数据库,如果这时数据库处在一个事物当中,则数据库将这些SQL语句缓存起来,当Hibernate进行commit时,会告诉数据库,你可以真正提交了,这时数据才会永久保存下来,也就是被持久化了.    

       3、commit针对事物的,flush针对缓存的, 数据同步到数据库中后只要没有commit还是可以rollback的。

       可以这么理解,hibiernate有二级缓存,而平时一般只用一级缓存(默认开启),也就是session级的缓存。处于一个事务当中,当save的时候,只是把相应的insert行为登记在了以及缓存上,而flush是把缓存清空,同时把insert行为登记在数据库的事务上。当commit提交之后,才会执行相应的insert代码,而commit又是隐性的调用flush的,那在commit之前调用flush的作用的什么?我的理解是防止多条SQL语句冲突,这是因为flush到数据库中执行SQL语句的顺序不是按照你代码的先后顺序,而是按照insert,update....delete的顺序执行的,如果你不按照这个顺序在代码中编写,如果逻辑一旦出错就会抛exception了,解决这个的办法之一就是在可能其冲突的SQL操作后面flush一下,防止后面的语句其冲突

同时flush的作用,也有提交大量数据时候清理缓存的作用

分析下面一段代码:

[java] view plaincopyprint?
  1. public void testSave1() {    
  2.   Session session = null;    
  3.   Transaction tx = null;    
  4.   try {    
  5.    session = HibernateUtils.getSession();    
  6.    tx = session.beginTransaction();    
  7.    User1 user = new User1();    
  8.    user.setName("李四");    
  9.    user.setPassword("123");    
  10.    user.setCreateTime(new Date());    
  11.    user.setExpireTime(new Date());    
  12.        
  13.    //因为user的主键生成策略采用的是uuid,所以调用完成save后,只是将user纳入到了session的管理    
  14.    //不会发出insert语句,但是id已经生成,session中existsInDatebase状态为false    
  15.    session.save(user);    
  16.        
  17.    //调用flush,hibernate会清理缓存,执行sql    
  18.    //如果数据库的隔离级别设置为未提交读,那么我们可以看到flush过的数据    
  19.    //并且session中existsInDatebase状态为true  </span>  
  20.    session.flush();    
  21.        
  22.    //提交事务    
  23.    //默认情况下commit操作会先执行flush清理缓存,所以不用显示的调用flush    
  24.    //commit后数据是无法回滚的    
  25.    tx.commit();    
  26.   }catch(Exception e) {    
  27.    e.printStackTrace();    
  28.    tx.rollback();    
  29.   }finally {    
  30.    HibernateUtils.closeSession(session);    
  31.   }    
  32.  }    
  33.      
  34.      
  35.  public void testSave2() {    
  36.   Session session = null;    
  37.   Transaction tx = null;    
  38.   try {    
  39.    session = HibernateUtils.getSession();    
  40.    tx = session.beginTransaction();    
  41.    User2 user = new User2();    
  42.    user.setName("张三1");    
  43.    user.setPassword("123");    
  44.    user.setCreateTime(new Date());    
  45.    user.setExpireTime(new Date());    
  46.        
  47.    //因为user的主键生成策略为native,所以调用session.save后,将执行insert语句,返回有数据库生成的id    
  48.    //纳入了session的管理,修改了session中existsInDatebase状态为true    
  49.    //如果数据库的隔离级别设置为未提交读,那么我们可以看到save过的数据    
  50.    session.save(user);    
  51.     
  52.    tx.commit();    
  53.   }catch(Exception e) {    
  54.    e.printStackTrace();    
  55.    tx.rollback();    
  56.   }finally {    
  57.    HibernateUtils.closeSession(session);    
  58.   }    
  59.  }  </span>  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子作息时间不规律怎么办 冬天冻脸怎么办小妙招 冬天冻脚怎么办小妙招 冬天脚冷怎么办小妙招 初中生不爱学习父母该怎么办 早孕办公室买新办公桌怎么办 一年级学生专注度差怎么办 pscs6界面字体太小怎么办 psd文件打不开程序错误怎么办 经常熬夜皮肤暗黄怎么办 炎症引起的经期不来怎么办 父母沉迷于炒股该怎么办 宝宝嘴周边红了怎么办 后背被嘴吸出牙印怎么办 宝宝嘴巴周围长湿疹怎么办 宝宝脸蛋都是红红的湿疹怎么办 药流药第一天晚上的忘吃怎么办 我有口臭不想出门怎么办 入职10天想辞职怎么办 提完辞职报告不想上班了怎么办 吃流产药出血少怎么办 新车漆被刮掉了怎么办 新车被别人撞了怎么办 新买的车被撞了怎么办 临时牌掉了一张怎么办 车子在停车场被刮了怎么办 金毛不想养了怎么办 gta5老是掉线怎么办ps4 养狗身上有味道怎么办 身上有异味怎么办%3f 花钱花多了后悔怎么办 想去当兵有纹身怎么办 爸家里人欺负我妈怎么办 部队退伍登记表填错怎么办 新手程序员第一次做项目怎么办 十六岁月经量少怎么办 大姨妈第一天痛怎么办 月经第一天很疼怎么办 神器挑战任务放弃了怎么办 内蒙古森林武警改革新兵怎么办 手挨打了有点肿怎么办