Hibernate中load和get的区别

这个问题很容易困然初学者,乍看下他们的功能都是一样,那么既生瑜何生亮呢? 
其实不然,Hibernate in action懒加载那一章,向你讲述了为什么. 
load方法,通过主键得到的是一个代理,在内存中标记了一个占位符,而不是直接从数据库中读取. 
session.load(User.class,new Integer(1)); 
这句话将得到 User的一个实例,并且user.setId(new Integer(1)); 该对象处在Persistent状态. 
一旦调用了user的非得到主键的方法,都将查询一次数据库. 
示例: 
下面这段代码,他不会去查询数据库 

  1. User user = (User)session.load(User.class,new Integer(1));  
  2. System.out.println(user.getUid());  

运行结果:

再看下面的代码

  1. User user = (User)session.load(User.class,new Integer(1));  
  2. System.out.println(user.getName());  

 

就会引发一次查询. 


而使用get方法,他不生成代理,而是直接查询.如果查找不到,返回null 
load查询首先是产生代理对象,真正需要某属性的时候,先去一级缓存查找,有二级缓存再去二级缓存查找, 
找不到才去数据库查询,因此,session不能被关闭,否则会报session not find exception, 
如果还是找不到则抛出ObjectNotFindException 

posted @ 2010-03-09 21:16  东苑草根  阅读(1039)  评论(0编辑  收藏  举报
手牵手 一步两步三步 往上爬