Hibernate中,用Load方法获取对象,但关闭Session后,使用get对象的get方法,不什么不报错 50

publicstaticvoidmain(String[]args){Sessions=null;Transactiontx=null;try{s=HibernateUt... public static void main(String[] args) {
Session s=null;
Transaction tx=null;
try {
s=HibernateUtil.getCurrentSession();
tx=s.beginTransaction();
Student sLoad=(Student) s.load(Student.class, 41);
s.close();//这里关闭了session,
System.out.println(sLoad.getId());
// tx.commit();
} catch (Exception e) {
e.printStackTrace();
if(tx!=null){
// tx.rollback();
}
}
}
展开
 我来答
fengzhilianmo
2016-05-13
知道答主
回答量:13
采纳率:100%
帮助的人:7319
展开全部
一、get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null

  而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy='false' 则不使用延迟加载,这是load的访问机制就和get一样了。

  二、对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。

使用load后不要关闭session 因为在真正要用到数据的时候 load方法要 在session开启时候发送sql语句往代理对象装数据
  总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
帅惜玉sh
2015-02-13 · TA获得超过243个赞
知道小有建树答主
回答量:343
采纳率:100%
帮助的人:304万
展开全部
HibernateUtil.getCurrentSession(); 这里取得session 就相当于取得一个连接 然后s.load 会把我们的数据加载到内存中 你的session 关闭了 但是我的数据依然在内存中
追问
这个不是session关闭后,就会清除一级缓存的对象吗?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式