Hibernate把他操作的对象分为三种状态: 瞬时态,持久态,游离态.区分的标志主要是是否有主键信息,是否和session有所联系
瞬时态:无主键信息,没有和session的联系
持久态:有主键信息,有和session的联系
游离态:有主键信息,没有和session的联系
瞬时态
在操作hibernate时,我们通常会让hibernate帮我们把对象存入数据库时自动生成主键.所以当我们从无到有创建一个对象时,这个对象既没有主键信息,也没有和session的联系,这时这个对象就是一个瞬时态对象.
比如我们要储存一个Customer信息,new Customer()之后得到了一个新的对象,这时我们开始设置Customer的各种属性(不设置主键,因为hibernate会帮助生成).然后调用save()方法把这个对象保存到数据库,在调用save()方法之前这个Customer对象就是一个瞬时对象.在调用了save()方法后,这个对象和session有了联系(因为是session.save(),可以看做是和session有了联系),并且hibernate也给他生成了主键信息.所以这个Customer就变成持久态.
持久态
我们会使用hibernate查看数据库的信息,会用get()或其他方法获取数据库中的信息并封装为一个对象.这时我们成功获取的对象就是持久态的对象.首先它拥有主键信息.并且它是通过session对象的方法获取的,也和session建立了联系.
hibernate给我最深的印象就是它的持久态对象,hibernate通过一级缓存和快照保存了我们从数据库中取出的对象(持久态),缓存的好处是提高查询效率,减少访问数据库的次数,快照呢则是当事务提交时他会对比之前从数据库中取出的对象的数据和事务提交时这些对象的数据,并把更改的数据更新到数据库中.这说明我们在更改了持久态对象的信息后并不需要调用修改信息的方法,在事务提交时会自动把我们对持久态对象所做的更改更新到数据库,我特别喜欢hibernate的这一特性.真的是特别好用.
游离态
游离态对象是这个对象有主键信息但没有与session的联系了.什么时候有这种情况呢?
比如我们用get获取了一个对象,之后用session.close()方法关闭了会话了.这时对象的主键是存在的,但是session已经被关闭了,不存在了,所以它与session的联系也就没有了,这时这个对象就是游离态对象.
三种状态的转换
在使用hibernate框架时,我们可以通过使用save(),update(),delete(),close()方法对象的状态进行转换.从名字上看,这些方法只是一般的添加数据的方法,修改数据的方法,获取数据的方法和删除数据的方法,就是我们一般所说的增删改查.但是在hibernate中不仅仅是这样,他们也进行了对象状态的转换,或者说在我们看来,hibernate其实就是通过操作三种状态的对象来实现我们对数据库的操作的.
save()方法:保存一个对象数据到数据库,实则是把瞬时态对象转换为持久态对象.
update()方法:更新一个对象数据到数据库,实则是把游离态对象转换为持久态对象.
dalete()方法:从数据库中删除一个对象数据,实则是把持久态对象转换为瞬时态对象(虽然对象中仍然存在主键信息,但是数据库中并没有这条记录,所以这个主键也就没有意义了).
close()方法:关闭session,实则是把持久态对象转换为游离态对象.
笔者能力有限,文章内容仅是自己的理解,大神勿喷.祝大家生活快乐.