`
paddy.w
  • 浏览: 498765 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转载】Hibernate中Session.get()和Session.load()的区别

阅读更多
        学习hibernate时遇到session.load()这么个方法,看参数和get()方法一样,于是搜索了一下,看来和我有同样问题的人也不少。看到一篇博文写的不错,正是讲两者区别的。于是借来学习一下,以作备忘。

        Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

        如果未 能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
        Load方法可返 回实体的代理类实例,而get方法永远直接返回实体类。
        load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓 存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session在加载实体对象时,将经过的过程:

        首 先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第 二级缓存则存在于SessionFactory层次,由当前所有由本SessionFactory构造的Session实例共享。出于性能考虑,避免无谓 的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命 中,且数据状态合法,则直接返回。
        之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在 同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件(相当于一个 查询黑名单列表)。如此一来,如果Session中一个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。
对于load方法 而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。
        如在缓存中未发现有效数据,则发起数据库查询操作 (Select SQL),如经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。
        根据映射配置 和Select SQL得到的ResultSet,创建对应的数据对象。
        将其数据对象纳入当前Session实体管理容器(一级缓存)。
        执 行Interceptor.onLoad方法(如果有对应的Interceptor)。
        将数据对象纳入二级缓存。
        如果数据对象实现了 LifeCycle接口,则调用数据对象的onLoad方法。
        返回数据对象。

PS:平常用load比较好。
分享到:
评论

相关推荐

    Hibernate中Session.get()方法和load()方法的详细比较

    今天小编就为大家分享一篇关于Hibernate中Session.get()方法和load()方法的详细比较,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    hibernate get load区别

    get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库

    Hibernate中get()和load()的区别.docx

    Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别。 1. get() 使用get()来根据ID进行单条查询: User user=session.get(User.class, "1"); 当get()方法被调用的时候...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    Hibernate Session中的 flush方法的作用 get和load方式是根据id取得一个记录 下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。 1.从返回结果上对比: load方式检索不到的话会抛出org....

    hibernate操作数据库笔记

    //该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...

    hibernated的线程同步问题

    hibernate数据的并发控制,及hibernate中的session.get()与session.load()方法异同

    Hibernate 查询方式总结

    1. get() and load() Java代码 session.get(Clazz, id); session.load(Clazz, id); session.get(Clazz, id); session.load(Clazz, id); 说明: load()与get()的区别 请注意如果没有匹配的数据库记录,load()方法可能...

    Hibernate面试题分析_尚硅谷_佟刚

    1. Hibernate 的检索方式有哪些 ? 2. 在 Hibernate 中 Java 对象的状态有哪些 ? 3. Session的清理和清空有什么区别? 4. load()和get()的区别 5. hibernate 优缺点......

    hibernate基础教程

    Hibernate中使用了一级缓存和二级缓存的机制来提高程序的性能. 一 为什么要使用缓存? 缓存是一块存储区域,可能是一块内存,也可能是一块硬盘.缓存能起到缓冲的作用,把程序经常使用...

    Java 面试宝典

    34、String 和 StringBuffer 的区别 ............................................................................... 24 35、如何把一段逗号分割的字符串转换成一个数组? .......................................

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 ...

    ssh(structs,spring,hibernate)框架中的上传下载

    CONTENT表字段上,在Spring中采用OracleLobHandler来处理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle数据驱动程序的具体类且屏蔽了不同数据库处理Lob字段方法上的差别,从而撤除程序在多数据库移植...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.4.2 Session的load()和get()方法  8.4.3 Session的update()方法  8.4.4 Session的saveOrUpdate()方法  8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 ...

    Java常见面试题208道.docx

    120.get()和 load()的区别? 121.说一下 hibernate 的缓存机制? 122.hibernate 对象有哪些状态? 123.在 hibernate 中 getCurrentSession 和 openSession 的区别是什么? 124.hibernate 实体类必须要有无参构造函数...

Global site tag (gtag.js) - Google Analytics