hibernate对象的状态

Session.load/get方法区别:

均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象

1,  如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException

2,  Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。

3,  load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据库读取。 

Hibernate对象的三种状态

瞬时的(Transient

new操作符创建,且尚未与Hibernate Session关联的对象被认定为瞬时的(Transient)的。也就是说在session中没有缓存,在数据库中没有与瞬时(Transient)对象相对应的记录,没有被分配一个持久化标识(identifier)。如果瞬时对象在程序中没有被引用,它会被Java垃圾回收器(garbage collector)销毁。

持久的(Persistent

一个持久(Persistent)的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。 持久(Persistent)的实例在相关联的Session的缓存。Hibernate会检测到处于持久状态的对象的任何改动,在当前操作单元执行完毕时将对象的状态同步到数据库,开发者不需要手动执行UPDATE语句。同样的,将一个对象变为瞬时(Transient)状态,也不需要手动执行DELETE语句

分离的(Detached

与持久对象关联的Session被关闭后,对象就变为分离的(Detached)的。数据库中有与之对应的记录,但是session中没有对应的缓存。对分离对象的引用仍然是有效的,对象可以继续被修改。分离对象如果重新关联到某个新的Session上, 会再次转变为持久的,而且在Detached其间的改动将被持久化到数据库中。

Session的不同操作对对象状态的影响:

Sessionsave()方法

          save()方法将一个瞬时对象转变为持久对象。

Sessionupdate()方法

          update()方法将一个分离对象转变为持久对象。

Sessionlock()方法

          调用lock()方法将对象同Session相关联而不强制更新。

Sessionmerge()方法

          拷贝指定对象的状态到具有相同对象标识符的持久对象。

SessionsaveOrUpdate()方法

          saveOrUpdate()方法对于瞬时对象,执行save()方法,对于分离对象,执行update()方法。

Sessionload()get()方法

          load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。

Sessiondelete()方法

          delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条delete语句。如果传入的参数是分离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。

Sessionevict()方法

          evict()方法从Session的缓存中删除一个持久对象。

 

猜你喜欢

转载自0411.iteye.com/blog/1056395