Hibernate持久化对象存在三种状态
瞬时态 transient
持久态 persistent
脱管态 detached 数据库中有数据与之对应,
瞬时态 transient
尚未与Hibernate Session关联对象,被认为处于瞬时状态,失去引用将被JVM回收
无持久化标识OID,未与Session关联
持久态 persistent
数据库中有数据与之对应并与当前session有关联,
并且相关联的session没有关闭数据库并且事务未提交
存在持久化标识OID,与Session关联
存在持久化标识OID,与Session关联
脱管态 detached 数据库中有数据与之对应,
但当前没有session与之关联,脱管状态改变hibernate不能检测到
存在持久化标识OID,未与Session关联
存在持久化标识OID,未与Session关联
* Hibernate持久化对象存在三种状态
1)瞬时(临时):没有与session关联,没有持久化标志OID(OID 为null)
2)持久: 与session关联,有持久化标志OID
3)托管(离线): 没有与session关联,有持久化标志OID
* 对象的状态是可以相互转化的
* 如何直接获得一个瞬时对象:User user = new User();
瞬时---》持久对象 session.save(user);session.saveOrUpdate(user);
瞬时---》托管对象 user.setId(1);
* 如何直接获得一个持久对象:session.get(User.class,1);session.load(User.class,1);query.list();---所有的查询方法获得的对象都是持久对象
持久---》瞬时对象 session.delete(user);
持久---》托管对象 session.close();session.clear();session.evict(user);---清理缓存
* 如何直接获得一个托管对象:没有办法直接获得托管,必须由其他对象转化
托管---》瞬时对象 user.setId(null);
托管---》持久对象 session.update(user);session.saveOrUpdate(user);
* 所有的持久对象都被session的一级缓存引用,持久对象就是缓存中的对象
* 持久对象拥有自动更新数据库的能力,由于快照区的存在
* Session的一级缓存,缓存的是对象的地址
1)瞬时(临时):没有与session关联,没有持久化标志OID(OID 为null)
2)持久: 与session关联,有持久化标志OID
3)托管(离线): 没有与session关联,有持久化标志OID
* 对象的状态是可以相互转化的
* 如何直接获得一个瞬时对象:User user = new User();
瞬时---》持久对象 session.save(user);session.saveOrUpdate(user);
瞬时---》托管对象 user.setId(1);
* 如何直接获得一个持久对象:session.get(User.class,1);session.load(User.class,1);query.list();---所有的查询方法获得的对象都是持久对象
持久---》瞬时对象 session.delete(user);
持久---》托管对象 session.close();session.clear();session.evict(user);---清理缓存
* 如何直接获得一个托管对象:没有办法直接获得托管,必须由其他对象转化
托管---》瞬时对象 user.setId(null);
托管---》持久对象 session.update(user);session.saveOrUpdate(user);
* 所有的持久对象都被session的一级缓存引用,持久对象就是缓存中的对象
* 持久对象拥有自动更新数据库的能力,由于快照区的存在
* Session的一级缓存,缓存的是对象的地址