上面那个session.close()没有的(不过我觉得有没有都没关系吧),不好意思,笔误,
盼望达人解释一下:)

解决方案 »

  1.   

    sessionFactory.currentSession()不是你那么用的看hibernate官方文档:
    http://www.hibernate.org/42.html你需要先了解hibernate的session和transaction模型
      

  2.   

    你的session怎么有这样的用法:session.get(Class,int),难道是经过了封装
      

  3.   

    这是由于hibernate为了实现延迟加载而使用了代理类对象来代理实体类对象的机制造成的。在你的程序中当取得manager_对象时,属性park使用了延迟加载,也就是没有从数据库查询park表,而是用一个代理类对象来代替manager_.park对象,该类是Park类的子类,改写了Park类原有的方法,该对象只有一个parkId属性是有值的(从manager表中查得的值),其他属性都是null,当你执行manager_.getTpark().getParkId()时,可以获得parkId值,不需要查询数据(但是如果你要获取其他属性时,hibernate会自动执行数据库查询语句加载park实体类对象的所有值)。
    当执行session.load(Tpark.class,parkId)时,hibernate会从缓存中查找是否有该id对应的代理类对象或实体类对象,如果找到则返回该对象,而不管实体对象是否已经加载,所以象你这种情况已经有代理类对象存在则直接返回该代理类对象,而不查数据库,不会返回null。
    session.get(Tpark.class,parkId)则不同,如果缓存中该parkId没有对应的代理或实体类对象,则查询数据库,查不到返回null,如果缓存中已经存在该代理类对象,并且实体对象已加载,则还是返回该代理类对象,而非实体类对象,许多人所说的“get方法永远直接返回实体类对象”也有例外的时候,至少目前的hibernate版本是这样。如果该代理类对象的实体对象还没有加载,则hibernate会执行数据库查询,如果该id对应的记录不存在会报错。
    你的程序中执行session.load才会出现这种情况。如果你的数据库建立了这两个表的外键链接关系,就不会存在这种情况了。
      

  4.   

    asklxf,谢谢,小弟英语不是很好,看的比较慢(不过正在看),asklxf能简单的说几句么?呵呵session有get方法的吧?session.load找不到对象会报错,session.get就是返回null。
      

  5.   

    lujh99(闲云)按照你说的,是不是实际上我这里用load或者get实际效果都一样,返回的都是代理对象?
      

  6.   

    是的,后来试了一下,在缓存中已存在该id对应的代理类对象,数据还没加载时,执行session.get方法,hibernate查询数据库,查询不到数据时,在hibernate-3.2.0版本下不会报错而是返回未加载数据的代理类对象;在hibernate-3.2.0.ga版本下会报错。如果能查到数据都是返回加载了实体类对象数据的代理类对象。