Hibernate 提供了三种状态,分别是:
瞬时状态(transient):有人有删除状态,归并在这里;(对象未被初始化之前),实例对象通过new关键字在内存中开辟空间,但是此时并没有纳入到Hibernate的session中,如果变量对它作用,那么它就会被JVM(Java虚拟机)回收,瞬时对象在内存中是孤立的,它与数据库没有任何的关系,仅仅是一个信息携带的载体,加入一个对象一个瞬时对象被转换为持久状态,那么它的生命周期由JVM管理
持久状态(persisent):(对象被持久化)持久状态和数据库进行连接,他总是与session(一级缓存)和事务(Transaction)关联在一起,当持久状态下对对象进行数据库操作并不会立即执行SQL语句,而是等到事务的提交阶段(transaction.commit()),通过对比与数据库数据是否相同,如果不同,则进行更新操作。当对象由持久状态转变为游离状态,它的生命周期由session管理;
游离状态(detached):(对象曾经被持久化过,但是已经和session进行detached),此时数据库存在,但是session中不存在;当对象的session关闭,这个对象就从持久状态转变为游离状态,如果将该对象添加到新的session对象中,我们称之为跨session进行维护;
三种状态之间的转换:方法的使用请参考另外一篇博客https://mp.csdn.net/postedit/85335538
- 临时状态(瞬时状态):通过new方法创建,前面的都是Hibernate开启session的操作,本章不进行深究;
- 持久状态(Persist):
方式一:直接为持久状态:通过get/load(懒加载区别,本质一样),find(),iterate()方法;
方法的使用请参考另外一篇博客,本章只是探讨状态之间的关系
方式二:由临时态转变为持久态,通过save(),saveOrUpdata()方法
方式三:由游离态转变为持久态
- 游离状态:数据库存在,session中不存在
总结:
- 对于一个刚创建的对象(new),此时session和数据库中都不存在,那么该对象处于临时状态(瞬时对象);
- 对于通过调用save()方法,或者游离状态通过updata()转变为持久状态,只有在commit()时,才会通过比较进行更新操作;
- 离线对象,数据库中存在,只是没交给session管理