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

时间:2023-11-23 16:30:14

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

(1)load()读取

  1. User user = (User)session.load(User.class, userId);

(2)get()读取

  1. User user = (User)session.get(User.class, userId);

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

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

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

  1. User user = (User)session.load(User.class, userId);

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

  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的缓存中清空。