我在使用一对多关系的时候,设计了一个方法,方法体里有这样的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);
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);
要么你session in view的模式
楼上的是正解,但,要考虑系统的查询性能。要么,楼主在使用list的时候,把Session打开,使用完在关闭?
或者楼主吧HQL改成左外连接试试?呵呵,好久没用Hibernate了,也不知道我说的两种方法行不行。