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

Hibernate 中 load 方法简介

阅读更多

接触过 Hibernate 的朋友都知道 Session 中的 get 方法,而对于 load 方法,能够深入了解的人便不是很多。其实,如果能正确地是用 load 方法,可以是你的应用更加有效率;但是,load 方法的使用又会带来一些错误。实际上,只要我们能正确了解 load 方法,就避免这些错误的发生。下面,我以问答的形式简单介绍一下 load 方法。

 

  1. load 方法的返回值是什么?
           这要分两种情况了。第一种情况,如果是 load 某个已在 Session 中存在的 Object,即你要 load 的 Object 已经是 Persistent 状态了。那么,load 方法返回的对象便是这个 Object 的引用。在这种情况下,load 和 get 的返回值是一样的。第二种情况,如果 Session 中没有你所要 load 的数据,那 load 方法将会返回一个 HibernateProxy。

  2. load 方法总是不 hit 数据库?那我怎么知道 load 的数据是否存在?
          如果是 load Session 中已有的数据,自然不需要 hit 数据库。如果所 load 的对象在 Session 中不存在,load 方法将返回一个 Proxy,这时也不 hit 数据库。当你要方法 Proxy 所代表的实体中的除主键外的属性的话,如果这个时候 Session 中还是没有相应的对象的话,Hibernate 就将 hit 数据库,并进行 Proxy 的初始化。如果数据库中没有相应的数据,load 便会抛出异常。这也是 load 方法与 get 方法不同的地方,在数据不存在的情况下,get 返回 null,而 load 则抛出异常。
  3. load 的方法都会抛出哪些异常?
          常见的由 load 引起的 Exception 有两种:ObjectNotFoundException 和 LazyInitializationException。前者是由于所 load 的数据在数据库中并不存在引起的。后者一般是由于 load 方法使用不正确造成的:得到由 load 返回的 Proxy 之后,在 Session 关闭的情况下 init Proxy 就会得到 LazyInitializationException。
          另外,在使用 load 设置引用属性值的时候,还可能出现违法外键约束的异常。简言之,只要确保你 load 数据是存在的,并且在 Proxy 初始化的时候保证 Session 是打开的就能避免这些 Exception 的出现。
  4. 什么时候使用 load 方法?
          简单说来,当你只想取得对数据库中一条记录的引用,而不是想的这条记录中的数据的时候(比如设置外键关系),就可以使用 load 而不是 get 方法。这样可以避免不必要的数据库访问。但是,使用 load 要格外小心,因为它比 get 方法更容易出问题。
3
3
分享到:
评论
2 楼 gaoskill 2012-08-06  
1 楼 gaoskill 2012-08-06  

相关推荐

    gilead hibernate lazyload例子

    Hibernate 的 lazyload 在FLEX中的解决方法例子 用的是gilead 因为LIB包太大上传很慢所以被我删掉了。

    hibernate get load区别

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

    hibernate中get和load方法的区别

    NULL 博文链接:https://ysj5125094.iteye.com/blog/1897557

    Hibernate中load方法与get方法的区别

    Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的

    Hibernate的get和load方法的区别

    NULL 博文链接:https://811417208-qq-com.iteye.com/blog/506950

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

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

    Hibernate持久层方法汇总

    Hibernate持久层方法汇总 session.load, session.find, session.iterator, session.save, session.update, session.saveorupdate

    hibernate中get和load的区别共5页.pdf

    hibernate中get和load的区别共5页.pdf.zip

    Hibernate查询 load与get的区别及其它查询测试

    NULL 博文链接:https://quicker.iteye.com/blog/658451

    hibernate 三种 查询 方式 load与get的区别

    NULL 博文链接:https://cici9898-007.iteye.com/blog/1847710

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

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

    hibernate基础教程

    2、load()方法 3、批量存储:session.flush()和session.clear() 二 Hibernate中的二级缓存结构 在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,...

    hibernate操作数据库笔记

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

    hibernate 3中的缓存小结

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

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

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

    Hibernate 延迟加载剖析与代理模式应用

    Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。...

    精通 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 ...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    8.4.2 Session的load()和get()方法 194 8.4.3 Session的update()方法 195 8.4.4 Session的saveOrUpdate()方法 197 8.4.5 Session的merge()方法 198 8.4.6 Session的delete()方法 200 8.4.7 Session的replicate...

    Hibernate+Proxool配置

    由于项目需求的需要,我们引入了连接池。...我们采用了Hibernate,所以可以考虑hibernate自带的连接池机制,但是发现效率不高,而且Hibernate也推荐使用c3p0或Proxool连接池,在我们的项目中采用了Proxool

Global site tag (gtag.js) - Google Analytics