码迷,mamicode.com
首页 > Web开发 > 详细

hibernate session中的load与get

时间:2015-10-31 21:28:16      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

一、get不支持lazy,load支持lazy。 

二、采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常。 

三、执行load()时,先从Session查找当前的对象是否存在,如果不存在,则从数据库中去查询,如果不存在这条记录,则扔异常;执行get()的时候,不论Session中是否存在当前对象,直接从数据库中去查询,如果不存在,则返回null。 

四、load()方法可以返回实体的代理类实例,而get()永远只返回实体类. 

get的例子: 

public void testGetMethod() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      //马上发出查询sql,加载User对象 
      User user = (User)session.get(User.class, "402880d01b9bf210011b9bf2c2ff0002"); 
      System.out.println("user.name=" + user.getName()); 
       
      user.setName("张三"); 
      session.getTransaction().commit(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 

PS:在执行第8行语句的时候,如果数据库有相关的记录,则立刻发出sql语句,即使是没有第9行中user.getName()方法调用,如果没有匹配的记录则返回来一个null。 

load方法例子: 

public void testLoadMethod() { 
    Session session = null; 
    try { 
      session = HibernateUtils.getSession(); 
      session.beginTransaction(); 
       
      //不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载) 
      //延迟加载:只有真正使用这个对象的时候,才加载(发出sql语句) 
      //hibernate延迟加载实现原理是代理方式 
      User user = (User)session.load(User.class, "402880d01b9bf210011b9bf2b2ff0002"); 
      System.out.println("user.name=" + user.getName()); 
      user.setName("李四"); 
      session.getTransaction().commit(); 
    }catch(Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 

PS:在执行到10句代码的时候并没有立刻发出sql语句,由于load实现了lazy延迟加载,延迟加载只有真正使用该对象的时候才进行加载, 发出sql语句,关键是11句代码。如果load方法里面的id在数据库表里面没有相关的,则会发出ObjectNotFoundException 异常。 

PS:可以通过设置断点,用debug来跟踪相关变量跟对象的改变,这样就可以很清晰理解load和get这两个方法。


hibernate,session load出来的对象是

持久态:对象于数据库记录建立对应关系并保持同步。对象被绑定在持久化上下文当中,今后它的任何状态变化、数据变更均处于工作单元的管理之下,这就是持久态。session.load在hibernate3.2中提供的默认延迟加载方式,我觉得load出来的是一个代理,也可以说是持久态(自己这么理解的,如有误请个高手纠正)。

 

hibernate session中的load与get

标签:

原文地址:http://www.cnblogs.com/kesar/p/4926135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!