最近在项目中用到了Spring MVC和Hibernate,碰到了一个问题就是数据创建和查询的时候都能立刻查询到,但是在update数据的时候,并没有立即持久化到数据库。
找了很久的资料,终于解决了问题,于是把心得分享下来以飨新手。
我们先来看看Hibernate的update session的问题:持久化对象分为三种状态;分为:瞬时态、持久态、托管态;处理持久态的对象也称为PO(Persistence Object),瞬时对象和脱管对象也称为为VO(Value Object)。当我们用Hibernate的getCurrentSession打开Session并进行数据更新操作时,此时的对象为瞬时对象或脱管对象。因此需要调用update将此瞬时对象或脱管对象转为持久对象。当转为持久对象时,Hibernate会自动对数据进行更新。如果调用更新后而没有调用session.flush()方法,此时虽然数据已经更新但是由于没有进行写入数据库,数据库的值依然还是没有改变的。因为在调用flush之前,数据是在内存中存储,并没有实时同步到数据库中。即flush是操作的持久态相关的数据,update是操作的脱管态相关的数据。
除此外我们还可以开启一个事务来管理,更新数据,必须提交事务,才会持久化到数据库中,否则就查询不到。关于Spring中提供了管理事务的机制。具体的方法请参考其他文献