Hibernate中session.flush()会不会去数据库执行SQL语句

首先可以确定的是,如果不提交事务的话,虽然会生成SQL语句,但数据库中的数据并不会改变


测试代码如下:

首先我的数据库中有这些条数据,实体对象为UserModel


代码如下

     Session session = HibernateUtil.getSession();
     Transaction transaction = session.beginTransaction();
     UserModel um = new UserModel();
     um.setUuid(8l);
     um.setUserName("update");
     um.setAge(30);
     um.setAddress("addr");
     <strong>session.update(um);
     <span style="color:#FF0000;">transaction.commit();</span></strong>
     um.setAge(1000);
     <strong>session.flush();</strong>
     System.out.println("=====================");
     UserModel um2 = (UserModel) session.get(UserModel.class, 8l);
     System.out.println(um2.getAge());
     HibernateUtil.closeAll(session);

代码运行后的结果:

Hibernate: update tbl_user set userName=?, age=?, address=? where uuid=?
Hibernate: update tbl_user set userName=?, age=?, address=? where uuid=?
=====================
1000

代码运行后数据库数据的变化如下图:



      从上面结果可以看出,虽然生成了2条SQL语句,但是真正起效果的是在事务提交之前生成的那条update语句。Hibernate中session 执行完update语句话,会将对象加载到一级缓存中。而我上面的代码,在提交完事务后,又对相同 OID的对象进行了修改,当刷新缓存的时候,由于当前对象 也就是哪个um和一级缓存中保存的数据不一样,因此Hibernate会生成一条SQL语句,但是由于并没有提交事务,虽然SQL语句生成了,但是数据库依然是没有变化的。

    上面的代码,在刷新一级缓存后,又用session中的get方法去查找数据。因为get方法会先去一级缓存中验证是否有数据,如果有则取的是一级缓存中的数据。所以后面拿到的数据其实是一级缓存中的。如果这里的代码改成用SQL语句去查询的话,拿到的数据结果就不会是1000了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值