zoukankan      html  css  js  c++  java
  • 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的缓存中清空。 

  • 相关阅读:
    Balanced Substring
    解决vscode可以编译通过c++项目,但头文件有红色波浪线的问题
    Poj2299---Ultra-QuickSort
    树状数组
    内置函数
    函数式编程,尾调用,map函数,filter函数,reduce函数
    函数作用域和匿名函数
    函数参数/局部变量与全局变量/前向引用(函数即变量)
    函数的定义
    字符串格式化
  • 原文地址:https://www.cnblogs.com/hanfeihanfei/p/6810038.html
Copyright © 2011-2022 走看看