以前用的都是createQuery方法,再取得list的第一项来获得对象,后来发现这样很笨,可以用get方法直接获得对象,再后来从网上看到load方法,用法与get相似,只是在网上说如果没有获得对象的话get方法返回的是一个null而load返回的是一个空代理异常
(could not initialize proxy - the owning Session was closed)
又查了查相关资料,才知道load主要是来获取二级缓存中的对象 而不用访问数据库
可以做了例子 还是出现上面说的异常 真不知道为什么
 请教load方法到底是做什么用的 在什么时候用它最合适

解决方案 »

  1.   

    load:在你获取对象的属性时才从缓存或数据库取数据(session如果已关闭,获取此对象的属性会抛出异常)
    get:对象的所有非lazy属性在调用此方法之后的任何时候可用
      

  2.   

    在Hibernate中,对于Session的读取操作提供两种方法:load()和get()。 对于程序读取的当前ID不存在的时候,load()方法就是直接抛出异常,而get()方法则返回null值!
    原理就如flyxxxxx(灭神)所说.
    UserInfo user1 = (UserInfo)session.get(UserInfo.class,"notexisting");
    Debug.check(user1 == null);
    UserInfo user = (UserInfo)session.load(UserInfo.class,"notexisting");
    Debug.check(user != null);logger.info(user.getClass());
    UserInfo user2 = (UserInfo)session.get(UserInfo.class,"notexisting");
    Debug.check(user2 == user);
    UserInfo user3 = (UserInfo)session.load(UserInfo.class,"notexisting");
    Debug.check(user3 == user);
    boolean error = false;
    try{    
       Hibernate.initialize(user3);
    }catch(ObjectNotFoundException e){   
       error = true;
    }
    Debug.check(error);
    UserInfo user4 = (UserInfo)session.get(UserInfo.class,"notexisting");
    Debug.check(user4 == user);
    UserInfo user5 = (UserInfo)session.load(UserInfo.class,"notexisting");
    Debug.check(user5 == user);