hibernate中对象的状态有三种:临时态(Transient)、持久态(Persistent)和游离态(Detached),三种状态转化的方法都是通过session来调用的,处于三种状态下的对象所具有的特点,总结如下:
临时态:没有被session管理
在数据库中没有与之匹配的记录;
持久态:纳入session管理
在数据库中有与之匹配的记录
当属性发生变化,在清理缓存时(脏数据检查)会自动和数据库同步;
游离态:没有被session管理
在数据库中存在与之匹配的记录.
临时态到持久态的方法有save()、saveOrUpdate()、get()、load();
持久态到临时态的方法有delete();
游离态到持久态的方法有update()、saveOrUpdate()、lock();
持久态到游离态的方法有:session.close()、session.evict()、session.clear()。
临时态:
当new一个实体对象后,这个对象处于临时态,即这个对象只是一个保存临时数据的内存区域,这个对象所保存的数据与数据库没有任何关系,除非通过Session的save或者SaveOrUpdate把临时对象与数据库关联,并把数据插入或更新到数据库,这个对象才转换为持久对象。
如果这个被new出来的对象并没有被变量引用,那么它会被java虚拟机回收。
//创建对象 Cat cat=new Cat(); cat.setName("miaomiao"); … CatDaocd=new CatDao(); //持久化,cat对象从临时态转换为持久态 cd.save(cat);
持久态:
持久化对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。对持久化对象进行delete操作后,数据库中对应的记录会被删除,持久化对象与数据库记录不再存在对应关系,持久化对象变成临时态。
持久化对象被修改后,不会马上同步到数据库,一直到数据库事务提交。
//创建对象 Cat cat=new Cat(); CatDaocd=new CatDao(); //使对象与数据库记录对应,对象是持久态 cat=cd.findById(1001); //修改了持久化对象,但没有同步到数据库 cat.setName("maomi"); cd.save(cat); //持久化对象同步到数据库 Transaction.commit();
CatDaocd=new CatDao(); //持久态变为临时态 cd.deleteByName("maomi");
游离态:
当与持久化对象关联的Session在Close、Clear或者evict后,持久化对象虽然拥有持久化标识和与数据库对应记录一致的值,但对象已不在持久化层管理之内而处于游离态。游离态的对象与临时态对象相似,只是它还含有持久化标识(ID)。当游离态对象被重新关联到session上时,会通过update(),saveOrUpdate()方法再次转换成持久化对象.
而且,如果这个处于游离态的对象也没有被变量引用,那么它也会被java虚拟机回收。
关于Hibernate中对象的三种状态就先总结到这里,大家一起进步~
版权声明:本文为博主原创文章,未经博主允许不得转载。