首先可以确定的是,如果不提交事务的话,虽然会生成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了。