在最近一个web项目中用hibernate作为ORM,要操作的两个表team和player正好是one-many的关系。我在业务层和持久层间加了一个DAO,PO就在这里获得,然后传到表示层。我获得一个team,然后在表示层通过team.getPlayers()来获得players,这个时候发生错误。大致意思是没有session或session已经关闭。后来查hibernate的文档,看来是我在集合那里设置了lazy=true,所以集合只有在读取的时候才载入,而session已经在DAO中关闭了。解决方法是不使用延迟初始化集合,或是把读取集合数据的语句提到Session被提交之前。但都没有充分利用Lazy Initialization这个特性,效率会不高。文档里介绍了在web应用中,可以用servlet过滤器在用户请求的完成之前来关闭Session,然后使用一个ThreadLocal变量来保存当前的Session。具体操作可以去forum.javaeye.com。