Hibernate中的get()和load()的异同

本文通过两个实例对比了Hibernate中get()与load()方法的区别,详细解释了立即加载与延迟加载的机制及其对程序运行的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  先来看一个例子:

static User getUser(int id){
  User user=null;
  Session session=null;
  try{
   session=HibernateUtil.getSession();
   user=(User)session.get(User.class, id);
  }catch(HibernateException e){
   throw e;
  }finally{
   if(session!=null){
    if(session.isOpen()){
     session.close();
    }
   }
  }
  return user;
 }

class Test{

public static void main(String arg[]){

 int id=2;
  User user=Test.getUser(id);
  System.out.print(user.getName());
 }

}

执行该类不会出现异常能正确显示用户名.

static User loadUser(int id){
  User user=null;
  Session session=null;
  try{
   session=HibernateUtil.getSession();
   user=(User)session.load(User.class, id);
     }catch(HibernateException e){
   throw e;
  }finally{
   if(session!=null){
    if(session.isOpen()){
     session.close();
    }
   }
  }
  return user;
 }

class Test{

public static void main(String arg[]){

 int id=2;
  User user=Test.loadUser(id);
  System.out.print(user.getName());
 }

}

执行该方法会出现异常,报初始化异常,这是因为load()方法是用了延迟加载策略,在没有使用该对象的方法或属性之前它返回的是继承该查询对象的代理类,当真的使用到该类的实行或方法时才会发出select语句去数据库中查询数据,这里我们在loadUser()方法中没有使用该对象的属性或方法所以这里返回的是一个代理类,并且在返回代理类后我们关闭了session这个对象当我们使用该对象的属性时发出查询语句时由于session 已经关闭,所以发出异常信息,只要我们把 System.out.print(user.getName());这个语句放到loaduser方法中就可以顺利执行.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值