Hibernate对象有三种状态:
瞬时状态(Transient):对象新创建的时候,失去引用时被JVM回收; 可通过save方法进入持久状态
持久状态(Persistent):通过save方法之后进入持久状态,在数据库与缓存中有记录; session关闭进入脱管状态
脱管状态(Detached):在数据库中有记录,缓存中没有; 可通过load,get,或查询再次进入持久状态;或者当本session关闭后,重新打开一session,并调用update方法使对象进入持久状态。
对象状态变化图:
示例:
public void testQuery3() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
List list = session.createQuery("select s from Student s where s.id=3").list();
for (Iterator iterator = list.iterator(); iterator.hasNext();) {
Student object = (Student) iterator.next();
System.out.println(object.getName());
object.setName("yeyeyeye");
}
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
public void testQuery4() {
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();
Student s = (Student)session.load(Student.class, 3);
System.out.println("从数据库load>>>" + s.getName());
s.setName("444");
System.out.println("load完后进入持久状态,调用setName方法,更新数据库>>>" + s.getName());
session.getTransaction().commit();
session.beginTransaction();
session.update(s);
s.setName("yyyy");
System.out.println("在另一个session中利用update方法再次使对象进入持久状态,并调用setName方法,更新数据库>>>" + s.getName());
session.getTransaction().commit();
}catch(Exception e) {
e.printStackTrace();
session.getTransaction().rollback();
}finally {
HibernateUtils.closeSession(session);
}
}
第一个示例通过查询使对象进入持久状态,更调用setName进行更新。注意这里更新可以不调用update方法的。