都说hibernate开发接口中的get() 和load()方法是有区别的,在于它们向数据库发送SQL语句的时段不同。但我执行下面这两个测试的时候,却没有出现意料的错误。@Test
public void tesGet() {
Teacher t = new Teacher() ;
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
t = (Teacher)session.get(Teacher.class, 2) ;
session.getTransaction().commit();
System.out.println(t.getClass()) ; 
}
@Test
public void tesLoad() {
Teacher t = new Teacher() ;
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
t = (Teacher)session.load(Teacher.class, 4) ;
session.getTransaction().commit();
System.out.println(t.getClass()) ; 
}

解决方案 »

  1.   

    应该是load有延迟加载,get没有
      

  2.   

    是啊。但,我的junit就是没报错啊。。
      

  3.   

    这是最常问的问题,楼主搜一下百度谷歌必定能搜到好几页的答案。
    这里先贴一个:
    http://blog.163.com/love-love-l/blog/static/210783042009618919985/
      

  4.   

    getClass()等特殊方法不需要读取数据库,不会报异常
      

  5.   

    lz,数据库中与Teacher对应的表有"class"这个字段??
      

  6.   

    这样不会报错的,因为load只有你用到它的代理对象时才会发sql啊
    你在testload里面执行下 t.getXXX()就会出异常了,如果你的4不是teacher的主键的话
      

  7.   

    我看书上将最好是get,忘了是为什么了
      

  8.   


    补充一下,
      load方法查询返回肯定有个对象,即使数据库无该记录,所以你调用object.getClass()不会有任何问题;
      

  9.   

    1. get 对当前查询的对象不进行延迟加载(但对象内的集合会),因为对于 get 会先去确认你传入的参数是否
       在数据库中存在,不存在返回 null;
    2. load 对当前查询的对象进行延迟加载,也可以对存在的瞬时/游离对象进行填充,load默认你查询的对象是在
       数据库中存在的,所以如果数据库中不存在的话,则抛出异常(在你使用这个对象需要发出SQL语句的时候)。
    如果你的 tesLoad() 中传入的 id=4 数据库中不存在的话,随便访问找到的 Teacher 对象的一个值,则抛出异常