Hibernate:对象状态

Hibernate中的OID

Hibernate对象状态

临时态

只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象

没有OID,和Session没有关系

持久态

与session关联并且在数据库中有相应数据。已经持久化,加入到了Session缓存中,如通过hibernate语句保存的对象,处于此状态的对象叫持久对象

有OID,和Session有关系

游离态

已经持久化,但不在Session缓存中,处于此状态的对象叫游离对象

有OID,和Session没有关系

删除态

已经调用了删除方法,即将从数据库中把记录删除,但是事务还没有提交,此时的对象状态是删除态

有OID,和Session有关系

 

 

三态之间的转换方法

如何成为临时态?

对象通过构造方法成为临时态;

持久态和游离态则通过session的delete方法成为临时态;

如何成为持久态?

对象可以由session的load或get方法直接成为持久态;

临时态对象可以通过save,saveOrUpdate或persist方法成为持久态;

游离态对象则可以通过update,saveOrUpdate成为持久态;

如何成为游离态?

游离态只能由持久态转换而来,通过close或clear方法实现;

几种转换方法的对比

get与load

都是都是根据id查询一个实体,从数据库中加载数据封装为java对象,使得java对象从临时态直接变为持久态。

区别:

①查询的时机不一样

get:每次调用get方法时,马上发起查询;

load:每次真正使用时,发起查询;

get即时执行insert,而load则是在使用此对象时才执行insert;

②返回的结果不一样

get:返回的对象是实体类类型;

load:返回的对象是实体类类型的代理对象;

get返回对象可以为null,load返回值则始终不为null,找不到时会抛异常;

save,update与saveOrUpdate

save是将临时态转为持久态,而update是将游离态转为持久态,saveOrUpdate可以说是两者的综合,它执行时先判断对象的状态(主要是通过有无主键判断的),若是自由态,则save,若是游离态,则update

save与persist

两者都是将对象由临时态转为持久态,但返回值不同:save返回主键值,而persist不返回

saveOrUpdate与merge

两者都是将临时态或游离态对象与数据库关联,但merge不改变对象的原有状态

clear与flush

clear是将session中的对象全部变为游离态,是对象由持久态变为游离态的一种方法(另外一种是关闭session);

flush方法时为了使update操作能即时进行(正常情况下,只有在事务关闭时才进行update操作)。

发布了202 篇原创文章 · 获赞 37 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/lovecuidong/article/details/99326393
今日推荐