瞬态:对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态。瞬态不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对象的引用,这个对象将被垃圾回收器回收。
持久化态: 持久化实例在数据库中有对应的记录,并拥有一个持久化标识。持久化的实例可以是刚刚保存的,也可以是刚被加载的(刚从数据库取出)(如果持久化的实例是刚刚保存的,那么在事务提交之前也就成为持久态了,注意,在session.save();后,对象就生成唯一主键(OID)了)。无论哪种,持久化对象,都必须与指定的Hibernate Session关联。如果处于持久化态的对象被改动,那么改动将反应到数据库中,开发者无需执行Update操作。
脱管态(游离态):某个实例曾处于持久化态,但随着与之关联的Session关闭,该对象就变成脱管状态。处于脱管状态的对象发生改动且再次与某个Session关联,那么改动也会反应到数据库中。
session.save()、session.update()和session.saveOrUpdate()的区别
1、save()在数据库中走insert语句,upate()在数据库中走update语句
2、save()执行后会放回Serilizable对象,它是记录的主键,update()返回空
3、saveOrUpdate()如果传入的对象如果存在则进行update操作,如果不存在则进行save操作,主键在saveorupdate()方法中是起着关键作用的。
(1)主键为空,直接走insert
(2)主键不为空,判断走insert还是update
总结:开发中,如果确切的知道需要是插入,则用save()操作,如果确切的知道是更新,则用update()操作,尽量少用saveOrUpdate,因为这个操作需要进行比较,浪费效率。