Hibernate中的Session应该在何处关闭? 10C
我了解到的是有两种方法,但我觉得有一种并不是很靠谱。
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,麻烦大家帮我解答一下,我纠结了很久。。。

8个回答

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

u014794644
瓦史托德 回复非一日之寒: 懒加载no session的问题,你百度一下大把,dao层关闭行不通的
2 年多之前 回复
zark721
勤勤勤能补拙 因为我查了之后有人说可以在dao层 开启session,用完再关闭 session,但是我觉得懒加载就会出错。
2 年多之前 回复
zark721
勤勤勤能补拙 还是使用过滤器的方式?
2 年多之前 回复
zark721
勤勤勤能补拙 回复952279952: 如果没有spring,session应该在哪里开启和关闭,是dao层吗?
2 年多之前 回复
u014794644
瓦史托德 回复非一日之寒: spring只是简化开发而已了
2 年多之前 回复
zark721
勤勤勤能补拙 /哭泣 是啊,可我还没学spring,请问hibernate是一定要和spring整合一起使用吗?
2 年多之前 回复

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

zark721
勤勤勤能补拙 回复Odyssey_May: 所以使用过滤器的方式比较靠谱吗?
2 年多之前 回复
Odyssey_May
Odyssey_May 回复非一日之寒: 我一般用的第二种方法比较多,以前用第一种方法经常报错,因为每次都要手动的关闭开启,经常忘了
2 年多之前 回复
qq_41688463
qq_41688463 没明白
2 年多之前 回复
zark721
勤勤勤能补拙 上面两种方法都是getCurrentSession,提交事务后都可以自动关闭session,我不清楚的是第一种方法可以解决懒加载问题吗?第二种是不是更靠谱
2 年多之前 回复

手动关闭
事务配置

在服务层finally模块中关闭session

zark721
勤勤勤能补拙 在service层开启和关闭session吗?
2 年多之前 回复

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

zark721
勤勤勤能补拙 上面两种方法都是getCurrentSession,提交事务后都可以自动关闭session,我不清楚的是第一种方法可以解决懒加载问题吗?第二种是不是更靠谱
2 年多之前 回复
LOLVVVVVVVVVlol
Lyoun_JAP 哈哈
2 年多之前 回复

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

zark721
勤勤勤能补拙 这样service层和 dao层会不会就耦合了,如果极端情况,项目不想用hibernate了,那么dao和service是不是都要换了?
2 年多之前 回复

用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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐