1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,而后在二级缓存中查找,尚未就查询数据库,数据库中没有就返回null。数据库
2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分状况讨论:缓存
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为 实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID之外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一 个ObjectNotFoundException。session
(2)若为false,就跟Hibernate get方法查找顺序同样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。spa
举例说明以下:hibernate
load加载方法:代理
Users user = (Users)session.load(Users.class, userId); 对象
get加载方法:get
Users user = (Users)session.get(Users.class, userId); 两加载方法区别:io
区别1:若是数据库中,没有userId的对象。若是经过get方法加载,则返回的是一个null;若是经过load加载,则返回一个代理对象,若是后面代码若是调用user对象的某个属性(好比user.getPassword())会抛出异常:org.hibernate.ObjectNotFoundException;class
区别2:load支持延迟加载,get不支持延迟加载。
也就是说:
Java代码
Users user = (Users)session.load(Users.class, userId);
这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。
而:Java代码
Users user = (Users)session.get(Users.class, userId);
则当即去执行数据库查询。
注意:Java代码
Users user = (Users)session.load(Users.class, userId);
System.out.println(user.getId());
上面这2句代码,不会去执行数据库操做。由于load后会在hibernate的一级缓存里存放一个map对象,该map的key就是userId的值,可是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。因此不会报任何错。不会执行任何数据库操做。