Hibernate中load和get的区别
这个问题很容易困然初学者,乍看下他们的功能都是一样,那么既生瑜何生亮呢?
其实不然,Hibernate in action懒加载那一章,向你讲述了为什么.
load方法,通过主键得到的是一个代理,在内存中标记了一个占位符,而不是直接从数据库中读取.
session.load(User.class,new Integer(1));
这句话将得到 User的一个实例,并且user.setId(new Integer(1)); 该对象处在Persistent状态.
一旦调用了user的非得到主键的方法,都将查询一次数据库.
示例:
下面这段代码,他不会去查询数据库
- User user = (User)session.load(User.class,new Integer(1));
- System.out.println(user.getUid());
运行结果:
再看下面的代码
- User user = (User)session.load(User.class,new Integer(1));
- System.out.println(user.getName());
就会引发一次查询.
而使用get方法,他不生成代理,而是直接查询.如果查找不到,返回null
load查询首先是产生代理对象,真正需要某属性的时候,先去一级缓存查找,有二级缓存再去二级缓存查找,
找不到才去数据库查询,因此,session不能被关闭,否则会报session not find exception,
如果还是找不到则抛出ObjectNotFindException
整理编辑: 东苑草根 zjut