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. 返回数据对象;

相关推荐