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的不同操作对对象状态的影响:
Session的save()方法
save()方法将一个瞬时对象转变为持久对象。
Session的update()方法
update()方法将一个分离对象转变为持久对象。
Session的lock()方法
调用lock()方法将对象同Session相关联而不强制更新。
Session的merge()方法
拷贝指定对象的状态到具有相同对象标识符的持久对象。
Session的saveOrUpdate()方法
saveOrUpdate()方法对于瞬时对象,执行save()方法,对于分离对象,执行update()方法。
Session的load()和get()方法
load()方法和get()方法都可以根据对象的标识符加载对象,这两个方法加载的对象都位于Session的缓存中,属于持久对象。
Session的delete()方法
delete()方法用于从数据库中删除与持久化对象对应的记录。如果传入的是一个持久化对象,Session就执行一条delete语句。如果传入的参数是分离对象,先使分离对象与Session关联,使它变为持久化对象,然后才计划执行一个delete语句。
Session的evict()方法
evict()方法从Session的缓存中删除一个持久对象。