一口一口吃掉Hibernate(二)——别被世俗蒙蔽了双眼:Hibernate中Session之get和load方法的真正区别
最近在学习SHH框架中的Hibernate,对Session的get和load方法,有点混不清楚,不知道区别在哪,或者对它们的区别感触不深。所以百度了一下,结果问题来了。百度的结果和实际测试的结果出入很大。主要是对get方法的说法跟实际运行的结果不一致。
先说一下观点吧:
get不支持lazy,load支持lazy;数据不存在时,get返回null,load则抛出ObjectNotFoundException异常。load方法可以返回实体的代理类实例,而get方法直接读取数据库,所以直接返回实体类(get的这个说法是错误的)
还有一个有趣的现象:User user5 = (User)session.load(User.class, "123"); System.out.println(user5.getId());运行结果直接输出 123 从结果中也可以看出,前2句代码,不会去执行数据库操作。因为load后会在hibernate的一级缓存里存放一个map对象,该map的key就是Id的值,但是当你getId()时,它会去一级缓存里拿map的key值,正好找到了,所以不会再去执行数据库查询。也不会报任何错。就有了以上的结果。