Hibernate中load与get,update与merge方法的区别

1、load()与get()的区别: 

(1)load()读取 

Java代码  收藏代码
  1. User user = (User)session.load(User.class, userId);  



(2)get()读取 

Java代码  收藏代码
  1. User user = (User)session.get(User.class, userId);  



以上是load与get的读取方式,看上去差不多,以下来说说他们的区别: 

(1)load方法读取是假定在数据库中存在的,如果在数据库中不存在,则会抛出异常; 
   而get方法不会去假定数据库中是否存在,如果不存在则返回null。 

(2)load方法返回的是实体类的代理类,因此load方法可以使用lazy策略来加载对象; 
   get方法返回的可能是实体类也可能是代理类,因为get方法如果在session缓存(一级缓存)中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象。 

Java代码  收藏代码
  1. User user = (User)session.load(User.class, userId);  


这句代码不会立即发出sql,只有用到user对象时才会去查询。 

Java代码  收藏代码
  1. User user = (User)session.get(User.class, userId);  


以上代码会立刻做查询。 


2、saveOrUpdate()与merge()的区别: 

(1)saveOrUpdate: 
如果saveOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常 org.Hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session,saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象。 

(2)如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例。 


3、evict()与clear()的区别: 

clear完整的清除session缓存 
evcit(obj)把某个持久化对象从session的缓存中清空。 

posted on 2017-05-04 21:42  我是陌生人  阅读(266)  评论(0编辑  收藏  举报