我在使用一对多关系的时候,设计了一个方法,方法体里有这样的List list = Session.createQuery().list();的语句,这个方法大概要执行的功能就是通过一条HQL语句,最后从数据库中得到一个list,然后我要开始在别的类中调用这个方法,并对这个方法的返回值list进行一些操作,但是发现如果在该session.close()执行前操作这个list没有任何问题,但是在这条语句关闭之后再来操作list,JVM会报一个Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: entity.Note.tags, no session or session was closed,请问各位高手是何道理?一般遇到这样的问题要如何解决呢?以下是我相关的代码:这段代码就是我利用HQL语句最终得到一个list的方法public List getNoteText(String[] tag){
List list = new Vector();
ss = null;
tr = null;
try {
ss = service.Util.getSession();
tr = ss.beginTransaction();

                          Query query = ss.createQuery("from Note n where n.id in   
                           (select tag.note.id from Tag tag where  tag.content = ? ")

query.setString(0, tag[0]);
list = query.list();

         tr.commit();
} catch (Exception e) {
e.printStackTrace();
tr.rollback();
throw new RuntimeException("error when getNoteText");
}
finally{
Util.close(ss);
} System.out.println(list);
return list;
}
这段代码调用了上述的方法,这2段代码位于不同的类之中,然后就会报Exception in thread "AWT-EventQueue-0" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: entity.Note.tags, no session or session was closed的错误!!List list = server.getNoteText(string);

解决方案 »

  1.   

    配置一对多关系的时候,设置lazy="false"就是不延迟,马上加载
      

  2.   

    延迟加载改成false
    要么你session in view的模式
      

  3.   

    用spring了吗,用了的话可以用OpenSessionInViewFilter解决,在web.xml中配置下这个filter
      

  4.   

    今天我的也是同样的问题,你这个对象里是否包括了别一个对象,而你取的时候是取这个List对象中的对象的别一个字段值,即多对一的关系,你需要以上楼主讲的那样,把 lazy="false" 就可以了
      

  5.   

    顶3楼4楼滴。
    楼上的是正解,但,要考虑系统的查询性能。要么,楼主在使用list的时候,把Session打开,使用完在关闭?
    或者楼主吧HQL改成左外连接试试?呵呵,好久没用Hibernate了,也不知道我说的两种方法行不行。