hibernate 一个事物中先更新一个对象 在查询所更新的对象 ?
hibernate默认更新(update)SQL先放在hibernate的缓存中等事务commit的时候一起提交,不按代码的顺序来执行 ;
查询操作是实时刷新(flush)的 按代码的先后顺序 ,所以查询到的对象的数据是更新之前的数据 不符合业务逻辑
通过查阅Hibernate的API可以知道flush方法的主要作用就是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性。它的主要动作就是向数据库发送一系列的sql语句,并执行这些sql语句,但是不会向数据库提交。而commit方法则会首先调用flush方法,然后提交事务。这就是为什么我们仅仅调用flush的时候记录并未插入到数据库中的原因,因为只有提交了事务,对数据库所做的更新才会被保存下来。因为commit方法隐式的调用了flush,所以一般我们都不会显示的调用flush方法。
所以解决此问题是在更新(update)SQL 后执行session.flush()方法 把更新的SQL刷入数据库。
Session session = getHibernateTemplate().getSessionFactory().getCurrentSession();
this.getHibernateTemplate().update(object);
session.flush();