1.简述
Hibernate中将java对象分为了三种状态:瞬时状态(Transient)、持久状态(Persistent)、游离状态(Detached)
瞬时状态(Transient):刚创建的普通对象,不存在session的缓存之中的对象,被称作为瞬时对象。
瞬时对象比较好区分,瞬时对象不存在于Session缓存中,并且与数据库也没有任何关系。
持久状态(Persistent):已经被持久化的对象,session缓存中有对应记录的对象称为持久化对象。
持久化对象存在于Session缓存中,也可能存在于数据库中。
之所以说可能存在于数据库中是因为对象的持久化操作一般都是:获取Session、开启事务、调用save方法、提交事务、关闭session。而当你调用Session的save方法进行持久化操作时,并不会立刻将对象保存到数据库中,而是先将对象添加到Session缓存中,然后等待事务提交时再将缓存中的对象保存到数据库中。所以严格说,当调用save方法后,对象已经转换成为了持久化对象,此时Session缓存中存在此对象。但是如果在save方法后,事务提交前出现了一个异常,又或者忘记了提交事务,那么此对象就不不会被保存到数据库中。所以说持久化对象可能存在于Session缓存中。
查询语句也有可能会造成数据库记录的更改:原因是因为如果执行查询之前,开启了事务的话,那么查询出来的对象全部都是持久化状态的对象。当一个持久化对象的属性被更改(Session缓存中的对象主键不能重复且不能更改)在提交事务时,会额外产生一条update语句用来更新数据库记录。
游离状态(Detached):已经被持久化,但是不存在与session缓存中的对象称为游离对象。
游离对象不存在与Session缓存中,但是数据库中有对应的记录。
游离对象与瞬时对象唯一的区别就是游离对象比瞬时对象多了一个数据库标识(ID),游离对象可以与Session
重新建立关系从而转变为持久化对象,当游离对象的ID被修改后,那么此对象就转变为了瞬时状态的对象。