Transaction.commit()隐式调用Session.flush()

对于hibernate,它的对象有三种状态,transient、persistent、detached

transient:瞬态或者自由态

persistent:持久化状态

detached:脱管状态或者游离态

Transaction.commit()隐式调用Session.flush()_第1张图片

Save()方法将瞬时对象保存到数据库,对象的临时状态将变为持久化状态。当对象在持久化状态时,它一直位于Session的缓存中,对它的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久的对象调用save()或update()方法是没有意义的。save仅仅对瞬时对象有用。

update()方法两种用途重新关联脱管对象为持久化状态对象,显式调用update()以更新对象。调用update()只为了关联一个脱管对象到持久状态,当对象已经是持久状态时,调用update()就没有多大意义了。处于持久化的对象的任何变化,不必人工调用update语句,hibernate自己会执行update的sql语句。换句话说,update动作仅仅对托管对象有用。

saveOrUpdate()方法兼具save()和update()方法的功能,对于传入的对象,saveOrUpdate()首先判断其是脱管对象还是临时对象,然后调用合适的方法。


Session的方法

persist和merge: 没有和数据库进行同步,需要调用flush来将缓存对象存入数据库,flush方法强制缓存数据与数据库同步

save和update:    处理后的数据处于持久状态,它要返回标识符,输出SQL,所以它会立即执行Sql insert将对象插入数据库,不管是在transaction内部还是外部

总的来说,对于长事务的处理,应该使用persist和merge,减少数据库交互。save和update会立即对数据库进行操作,persist和merge需要手动进行flush或者提交事务。


在未提交事务或显式的调用session.flush() 方法之前,也有可能会进行flush() 操作

①因为执行HQL 和Query By Criteria 时,需要保证获取的记录是最新的,因此 执行HQL 或QBC 查询,会先进行flush()操作, 以得到数据表中的最新的记录

 ②.调用save()方法后, 就会立即执行INSERT 语句


Transaction.commit()隐式调用Session.flush()

Transaction.commit()隐式调用Session.flush()_第2张图片
commit()


Transaction.commit()隐式调用Session.flush()_第3张图片
befor()


Transaction.commit()隐式调用Session.flush()_第4张图片
mangedFlush()通过此方法隐式调用了flush()

你可能感兴趣的:(Transaction.commit()隐式调用Session.flush())