一、对象的状态
hibernate中对象的状态
对象的状态一般是指对象的一组属性的值。而在这里的状态是指对象处于什么存储介质中。
用于存放对象的存储介质有三个:普通内存(与hibernate无关)、session缓存、数据库。
对象处于不同的介质,就将处于不同的状态。
1.1瞬时态:transient状态,对象在内存中存在,db中无记录,与session没关联。是个过渡状态。
1.2游离态:detached状态,对象在内存中存在,db中有记录,与sess没关联。
1.3无名态:在内存中不存在,db中有记录,与session没有关联
1.4持久态:persisient对象在内存中存在,db中有记录,并且与session相关联(在session中有对象的副本)
二、状态转换图
执行new对象的时候、该对象加载到内存当中了、但是此时数据库中没记录、且与session没有关联、这种状态即对象的瞬时态。
执行save、saveOrUpdate时将该对象保存到缓存(session)且同步到数据库中了、此时这种状态为:对象的持久态。
执行evict(只删除缓存中的数据、数据不安全)、close、clear将与session断开联系、这就是对象的游离态。
游离态的对象没有具体session去引用、经过垃圾回收器(garbage)回收、变为了无名态。如果对象在游离状态且执行了save()、saveOrUpdate()就又与特定session关联、这种状态又回到持久态。
持久状态的对象执行delete()方法时、删除了缓存和数据库中的数据、此时只存在内存中、没有任何对象去引用、经过垃圾回收器回收。这就是一个对象从没到有、从有到没经过的步骤和状态。
三、执行save方法前后对象的变化
由此可知hibernate是通过主键来管理对象的。且普通内存与Session缓存中的对象是同一个对象的引用。所以save前后student是对同一个对象的引用。