利用hibernate查询数据,通过一个封装的查询方法,但是没有做关闭session的操作,
我想把她给关掉,但是提示说session is closed
查询方法public List getO(String hql,int count){
try{
tx=session.beginTransaction();
query=session.createQuery(hql);
query.setMaxResults(count);
///////.uniqueResulst()
List list=query.list();
//session.flush();
tx.commit();
return list;
}catch(Exception e){
return null;
}
}
由于网页上有3个查询操作,我给写道一个ACTION里了,当我在getO()中关闭调SESSIONS是就提示SESSION is closed!难道不能够关闭调么
------解决方案--------------------去掉session.close()那句就可以啦
------解决方案--------------------查询一次声明一个session!!
------解决方案--------------------session最好写在构造方法里,一个对像一个SESSION.不过,应该可以CLOSE吧.
------解决方案--------------------估计是那个封装了的查询方法中关闭了session。你在代码中又关闭了一次session。所以造成了异常
------解决方案--------------------百度知道里转过来的
楼主只怕是初学Java,还没有搞清除HttpSession和Hibernate里的Session的区别。因为楼主说的东西是HttpSession的内容。
他们是完全不同的2个对象
javax.servlet.http.HttpSession是一个抽象接口
它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一表示。注意,是容器(Tomcat,Resin)自动创建的。
用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限。例如在购物车程序里,存放用户买的商品。
销毁:一定时间(跟容器有关)内,用户无任何动作,session自动销毁。
得到的方法:
HttpSession session = request.getSession();
常用方法setAttribute
session.setAttribute(key,value);
这样在另一个JSP或者Servlet里,可以用
session.getAttribute(key);得到value
类似一个Map
$$$$$$$$$$
org.hibernate.Session
是hibernate操作数据库的一个句柄对象。它跟上面那个Session唯一的相似处就是名字有点像,其他没任何一样的地方。
至于它的用法,相信我在下面已经说得很明白了。
不懂的加我QQ:178036872
***************************************
一般的Hibernate程序中,Session由用户手动获取,手动关闭。
正规项目中,在业务层获取Session
Session session = HibernateSessionFactory.openSession();
然后把此session传给dao层,将数据持久化或其他的操作。
一次业务逻辑可能调用多个dao方法,例如银行转帐,是一个先减后增的过程,所以会调用2个dao里的方法(甲帐户减,乙帐户增)。因此,可以利用业务层产生的同一个Session来做这件事
a1和a2代表帐户实体。
a1是甲的,a2是乙的。
a1.setAcount(a1.getAcount()-1000);
a2.setAcount(a2.getAcount()+1000);
dao.update(a1,session);
dao.update(a2,session);
Transaction tx = session.beginTransaction();
tx.commit();
最后在业务层,将session关闭
session.close();
或者调用HibernateSessionFactory.closeSession(session);
最好能加上异常捕捉,之类,如产生异常,即时回滚。保证操作不出意外。
try{
...
tx.commit();
}catch(Exception e){
tx.rollback();
}finally{
HibernateSessionFactory.closeSession(session);
}