当new一个对象时,这个对象就是瞬时对象,此时它们没有跟任何数据库表项关联;
瞬时对象(Transient Object):
使用new操作符初始化的对象不是立刻就持久的,首先是瞬时的,也就是说他们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其他对象所引用),它们的状态就会丢失,并由垃圾回收机制回收;
当一个瞬时对象被save(),update()时,这个对象的状态就变成持久化对象!
持久化对象(Persist Objects):
持久化实例是任何具有数据库标识的实例,它有持久化管理器session统一管理,持久实例是在事务中进行操作;它们的状态在事务结束时同数据库进行同步,当事务提交时,通过执行SQL语句吧内存中的状态同步到数据库中;
当一个持久化执行delete时,状态会由Persist变成Transient!
当一个对象evict(),close(),clear()时,就会状态由Persist变成Detached!
离线状态(Detached object):
session关闭后,持久化对象会变成离线状态,离线表示这个对象不能再与数据库保持同步,它们也不再受hibernate管理;
当这个离线状态执行Update(),saveOrUpdate(),或lock()方法是,状态会转化到Persistent!
看下代码解释:addStudentTest.java:
package cn.keith.hibernate; import java.util.Date; import junit.framework.TestCase; import org.hibernate.Session; import org.hibernate.Transaction; import cn.keith.hibernate.hibernateUtil.HibernateUtils; public class StudentTest extends TestCase { /*** * 一个操作对应一个session,Transaction */ public void addStudentTest() { Session session = null; Transaction ts = null; Student student = null; try { // 获取session session = HibernateUtils.getSession(); // 开启事务 ts = session.beginTransaction(); // 这时hibernate是Transient(暂停的,路过的)状态 student = new Student(); student.setName("keith"); student.setBirthday(new Date()); /** * 这时hibernate是Persistent(坚持的,持久稳固的)状态,hibernate处于persistent时, * 当对象属性发生改变时, hibernate在清理缓存时,会和数据库同步; */ session.save(student); // 提交事务 ts.commit(); } catch (Exception e) { e.printStackTrace(); // 当发生错误时,回滚事务 ts.rollback(); } finally { // 最后关闭session HibernateUtils.closeSession(session); } // 当结束完一个session时,hibernate处于detached(分离的,分开的)状态 student.setName("kejian"); try { session = HibernateUtils.getSession(); ts = session.beginTransaction(); /** * 这时hibernate是Persistent(坚持的,持久稳固的)状态,hibernate处于persistent时, * 当对象属性发生改变时, hibernate在清理缓存时,会和数据库同步; */ session.update(student); session.getTransaction().commit(); } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtils.closeSession(session); } } }