最近我们学到的Hibernate中,有个对房屋信息的查询功能。其中页面的一句代码如下:
以上写法用EL显示房屋的信息,但我们的DAO用Hibernate实现的时候,几个相关的对象都要把lazy设置成false,不然就会出现会话已经关闭的错误。以下是House.hbm.xml原来的写法:
因为在访问到house.street的时候,Hibernate还会再去查一次数据库,而如果我们的DAO中的代码如下:
会话已经关闭,就会出现会话关闭的错误。当然还有一种做法就是不关闭会话,不过这不是一种解决的办法。
虽然以后我们会学到Spring有更好的解决方法,但今天如果只用Hibernate的话,我们自己有没有办法去解决这个问题,就是让会话在请求结束后才关闭。这样也就不用把lazy设置成false了。于是就有了下面的过滤器的实现:
这样我们的DAO就可以这样写:
不用关闭会话,而House.hbm.xml就变成:
没有了lazy那项。
其中HibernateUtils的代码基本上是MyEclipse自动产生的。只是我把它汉化了。呵呵:
这样每次用户请求就会打开会话和事务,请求结束就提交事务,并关闭会话。解决了上面的问题。