`

hibernate之数据加载---Session.get/load

阅读更多

Session.get/load() 都是根据指定的实体类和id从数据库中读取记录,并返回与之对应的实体对象;

其区别:

  • 如果在数据库里未发现所要查询的值,get()返回Null,而load()抛出ObjectNullFoundException异常;
  • Load()方法可以返回实体的代理类实例,而get()永远直接返回实体类;
  • Load()可以利用内部缓存和二级缓存的数据,而get()只在内部缓存中查找,如果没有则发出SQL去执行查询;

 

看一个最简单的数据加载:

TUser user = (TUser) session.load(TUser.class, new Integer(1));

 session加载实体对象时,将经过哪些过程?

  1. 处于性能的考虑,Session在调用数据库查询功能之前,会先在缓存中查询,首先会根据实体类和id在内部缓存中查找;如果有值则返回它;
  2. 然后,Session会在当前"NonExists"记录中进行查找,如果“NonExists”记录中在同样的查询条件,则返回null;("NonExists"记录了当前session实例在之前所查询操作中,未能查到有效的数据查询条件[相当于一个黑名单查询列表],如此以来,如果session中一个无效的查询条件重复出现,即可迅速作出判断,获得更高性能);
  3. 对于Load()而言,如果内部缓存没有想要的值,那么继续在二级缓存中查询,如果有,则返回它;
  4. 如果在缓存中没能发现值,则发出SQL去执行查询操作,经过查询未发现对应记录,则将此次查询的信息记录到"NonExists";并返回null;
  5. 根据映射配置和SQL得到的ResultSet,创建对应的数据对象;
  6. 将其数据对象纳入当前Session实体管理容器(内部缓存)中;
  7. 执行Interceptor.onLoad方法(如果有对应的Interceptor);
  8. 将数据对象纳入二级缓存;
  9. 如果数据对象实现了lifeCycle接口,则调用数据对象的onLoad方法;
  10. 返回数据对象;

 

分享到:
评论

相关推荐

    spring_MVC源码

    15. <load-on-startup>1</load-on-startup> 16. </servlet> 17. <servlet-mapping> 18. <servlet-name>spring</servlet-name> <!-- 这里在配成spring,下边也要写一个名为spring-servlet.xml的文件,主要用来...

    java-Hibernate 检索

    例如,使用 session.get() 或 session.load() 方法可以根据 OID 获取对象。 session.get(Customer.class, 1); 三、HQL 检索 HQL 是 Hibernate 最常用的检索方式,它支持所有 SQL 支持的检索方式。HQL 是一种面向...

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

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

    hibernate get load区别

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

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

    这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...

    hibernate操作数据库笔记

    //该方法会立即加载/获取数据(只要调用该方法就会立即向数据库发出查询语句),该方法只在内部缓存查找数据,如果内部缓存中没有数据就直接去数据库查询,当数据库中没有要查询的数据时返回null (6).load(Class ...

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

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

    Hibernate查询语言HQL.PPT

    2. 通过标识符检索:使用 session.get() 方法或 session.load() 方法根据标识符检索对象。 3. 使用 HQL 检索对象:使用 Hibernate 查询语言 HQL 检索对象。 4. 使用 Hibernate 条件 API:提供了类型安全的面向对象的...

    hibernate 3中的缓存小结

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

    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基础教程

    在Hibernate中使用两极缓存结构,第一级缓存是Session级别的缓存,Session级别的缓存是由Hibernate管理的,一般情况下无需进行干预.第二级缓存是 SessionFactory级别的缓存,SessionFactory级的缓存可以进行配置和...

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

    2022年javaWeb面试题含答案.doc

    Session.load() 和 Session.get() 都可以根据指定的实体类和 id 从数据库读取记录,并返回与之对应的实体对象。其区别在于,如果未能发现符合条件的记录,get 措施返回 null,而 load 措施会抛出一种 ...

    jdbc基础和参考

    get()/load():从数据库中还原数据 get: 1.先从缓存中进行查找,如果找到就直接返回 2.如果找不到,get()会立即发送sql语句到数据库中查找数据,如果找到就返回,如果找不到返回null; load:(使用延迟加载策略) 1....

    支持多数据库的ORM框架ef-orm.zip

    而本质上,当我们调用某H框架的session.get、session.load、session.delete时,我们是想传递一个以对象形式表达的数据库操作请求。只不过某H框架要求(并且限制)我们将其视作纯粹的“单个”对象而已。JPA 2.0为了...

    传智播客李勇hibernate源码1-20课

    04_Session接口及get|load|persist方法 05_实体对象的三种状态与saveOrUpdate方法 06_完善HibernateUtil类及hql查询入门 07_实体类或属性名与数据库关键字冲突问题 10_使用Hibernate完成CRUD实验的步骤说明 11_...

    Java 面试宝典

    16、下面的代码有什么不妥之处? ............................................................................... 14 17、请说出作用域 public,private,protected,以及不写时的区别 ...........................

Global site tag (gtag.js) - Google Analytics