Hibernate中的Session应该在何处关闭?

我了解到的是有两种方法,但我觉得有一种并不是很靠谱。
1.第一种是用完就关闭,但这样如何解决懒加载问题?比如我在dao中直接  
public class UserDao{
    public User getUser(Integer id){
    session.sessionFactory.getCurrentSession();
    session.beginTransaction();
    User u = session.get(User.class,id); 
    session.beginTransaction().commit(); 
    session.close();
    return  u;//用完就关闭  
    }
}
这样返回到service层的是代理对象,当我们要取对象里面的数据的时候就会报错,因为session已经关闭,所以这种方法是错误的吗?
2.用Filter,在到达过滤器时,getCurrentSession(),并开启事务beginTransaction,然后放行doFilter,执行结束后回到Filter 再进行 事务提交/回滚。。我觉得这种方法还是可行的。
所以上述的两种方法哪一种的可行?
另外我是刚学struts和hibernate,还不懂spring,麻烦大家帮我解答一下,我纠结了很久。。。

第一种是需要手动关闭,第二种就是不用你手动关闭,当这个事务结束后会自动关闭,比较方便。
而spring框架你可以当做一个容器,像Struts、hibernate、springmvc、mybatis都是在这个框架中黏合,主要提供了IOC控制反转和AOP面向切面的功能等等

手动关闭
事务配置

事务和session都是spring来管理,第一种懒加载肯定报错啊

在服务层finally模块中关闭session

应该在相应方法最后面接个finally{ }语句块,用来关闭session,这样不论程序是否报错,都会正确关闭session

在service层finally模块中关闭session,不管是否报错,都会关闭

用Spring 管理啊,在服务层加入finally{}模块,这样你就可以不用管它了 ,反正自己会处理关闭。

spring框架利用aop编程可以帮我们管理事务的开启和关闭,在配置文件中,对某个service方法配置了事务管理,那么spring就会在调用service方法前开启事务,在service结束关闭事务,但这依旧存在懒加载问题,所以spring提供了一个过滤器,org.springframework.orm.hibernate3.support.OpenSessionInViewFilter,它帮我们延迟了session的关闭时间,可以使session在request的整个期间都可以使用,这样就解决了问题。
还是不懂可以看这个 http://blog.csdn.net/pengjun4312465/article/details/45166005