Hibernate的get与load方法

1.在懒加载方面的区别:
 
示例代码如下:
 
  1. public class HibernateTest {
  2.  
  3.  public static void main(String[] args) {
  4.     User user = getUser(1);
  5.     System.out.println(user.getName());
  6.  }
  7.  
  8.  static User getUser(int id){
  9.   Session session =null;
  10.   try{
  11.     session = HibernateSessionFactory.getSession();
  12.     session.beginTransaction();
  13.  
  14.    ① User user =(User)session.load(User.class, id);   
  15.    ② User user =(User)session.get(User.class, id); 
  16.  
  17.     return user;
  18.   }finally{
  19.    session.getTransaction().commit();
  20.    session.close();   
  21.   }
  22.  }
 
执行代码① 使用load方法:
 
执行结果如下:
 
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate. LazyInitializationException: could not initialize proxy - the owning Session was closed
 at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:56)
 at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
 at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
 at po.User$$EnhancerByCGLIB$$6b9e0a10.getName(<generated>)
 at po.HibernateTest.main(HibernateTest.java:10)
 
将抛出懒加载异常
 
执行代码②使用get方法
 
    
执行结果如下:
 
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
张三
 
执行结果正常输出。
 
 
2. 空值处理方面(所查询的值不存在):
示例代码如下:

 

  1.  Session session =null;
  2.   try{
  3.    session = HibernateSessionFactory.getSession();
  4.    session.beginTransaction();
  5.  
  6.    ①User user =(User)session.load(User.class, 2);   
  7.    ②User user =(User)session.get(User.class, 2); 
  8.  
  9.    System.out.println(user);
  10.    ③  System.out.println(user.getName());
  11.   }finally{
  12.    session.getTransaction().commit();
  13.    session.close();   
  14.   }
 
执行代码① 使用load方法:
 
执行结果如下:
 
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [po.User#2]
 at org.hibernate. ObjectNotFoundException.throwIfNull(ObjectNotFoundException.java:27)
 at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:65)
 at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
 at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:158)
 at po.User$$EnhancerByCGLIB$$6b9e0a10.toString(<generated>)
 at java.lang.String.valueOf(Unknown Source)
 at java.io.PrintStream.print(Unknown Source)
 at java.io.PrintStream.println(Unknown Source)
 at po.HibernateTest.getUser(HibernateTest.java:19)
 at po.HibernateTest.main(HibernateTest.java:9)
 
在①处将抛出 ObjectNotFoundException 异常,该异常在执行load方法发现不存在该对象时就抛出
使用load方法不会立即访问数据库,而是返回一个代理对象,只有在使用时,才回去访问数据库。
 
执行代码②使用get方法
 
    
执行结果如下:
 
Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.age as age0_0_ from mytest.user user0_ where user0_.id=?
null
Exception in thread "main" java.lang. NullPointerException
 at po.HibernateTest.getUser(HibernateTest.java:20)
 at po.HibernateTest.main(HibernateTest.java:9)
 
在执行get方法时,发现查询结果为空,将null赋给user,当执行user.getUser()方法③时会抛出空指针异常。
 
3.其他区别

1.  load方法可以返回实体的代理类,get方法则返回真是的实体类。

 

2.  load方法可以充分利用hibernate的内部缓存和二级缓存中的现有数据,而get方法仅仅在内部缓存中进行数据查找,如果没有发现数据則将越过二级缓存,直接调用SQL查询数据库。
 
3.  也许别人把数据库中的数据修改了,load如何在缓存中找到了数据,则不会再访问数据库,而get则会返回最新数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值