Session中load,get方法都是从数据库加载指定的OID持久化对象。如果数据库中不存在该记录时,load方法会抛出异常,而get方法返回null。他们俩的都是先从缓存中先来查找对象,缓存中没有,就从数据库中。加载上来的对象都是处于持久化状态,也就是说位于session的缓存中。看下面的代码
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
User user=new User();
s.save(user);
tx.commit();
s.close();
new出一个User对象 这时的User处于临时状态 执行save过后User对象变为持久化状态close过后User脱离了session的管理成为了游离态。
可见执行save方法中对象是临时状态 是可以插入记录的 那如果是参数是持久化状态呢?
User user=(User)s.get(User.class,8);
s.save(user);
以上代码通过实现不能被插入
那要是游离状态呢
User user=(User)s.get(User.class,8);
s.evict(user);//把user清出缓存,也就变为了游离态了
s.save(user);
结果是能被插入的 可见save方法对对象的三态结果是不样的
那用update呢
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
User user=new User();
S.update(user);
tx.commit();
s.close();
以上代码在实践的时候会出现org.hibernate.StaleStateException异常 可见用update方法更新临时状态的对象会出现异常的
如果换成是持久化状态
User user=(User)s.get(User.class,8);
s.update(user);
结果是不会出现任何现象的。
如果是换成是临时状态的对象时
User user=(User)s.get(User.class,8);
s.evict(user);//把user清出缓存,也就变为了游离态了
s.update(user);
结果你会发现不管user对象里面的记录变没变都会更新这里涉及到一个问题就是不能让没有变化的对象更新,如果希望仅当属性变化时才执行update语句的话可进行如下配置:
<class name=“…” table=“…” select-before-update=“true”>
那用方法savaorupdate呢
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
User user=new User();
s.saveorupdate(user);
tx.commit();
s.close();
执行saveorupdate方法中对象是临时状态 是可以插入记录的 那如果是参数是持久化状态呢?其他的同update方法一样
最后我们在看看delete方法运行的情况
如果参数是持久化对象,就执行一个delete语句,清理缓存使持久化对象转变为临时状态若为游离对象,先使游离对象被session关联,使他变为持久化对象,然后计划执行一个delete语句。