详解Hibernate对象的三态 (下)

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();

        Supdate(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语句。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值