请教一个hibernate和spring整合时的问题

在整合的过程中,发现一个问题,session并没有关闭。以下是说明:
[code="java"]protected Session getSession() {
return this.sessionFactory.getCurrentSession();
}[/code]
这是获取session的方法
code="java"this.getSession().get(this.clazz, id)[/code]
这是获取对象的方法
事务在配置文件中进行配置:
[code="java"] class="org.springframework.orm.hibernate4.HibernateTransactionManager">

[/code]
正常的情况来说,获取对象后,session就应该关闭了,可是在后面的测试中发现sesion并没有关闭,仍然可以查询出关联对象。网上说这种session不用手动关闭,请问它何时关闭

5个回答

建议看下spring容器事务管理,,事务关闭由容器负责

[url]http://jinnianshilongnian.iteye.com/blog/1442376[/url]

[url]http://jinnianshilongnian.iteye.com/blog/1441271[/url] 可以参考这个里边的事务传播图

hehe198504
葛一凡 问题已经得到解决,不是spring和hibernate的问题,是unitils这个测试工具中的事务默认是开启造成的,很感谢jinnianshilongnian 和avy0168 ,可是我的分已经用完了,很感谢两位的回答,谢谢。
7 年多之前 回复
hehe198504
葛一凡 @Transactional @SuppressWarnings("unchecked") public T getById(Serializable id) { return (T)this.getSession().get(this.clazz, id) ; }
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 你怎么调用的 get 发上来
7 年多之前 回复
hehe198504
葛一凡 <property name="hibernateProperties"> <props> <!-- 非常重要,不配置则出现Error applying BeanValidation relational constraints --> <prop key="javax.persistence.validation.mode">none</prop> <!-- 指定Hibernate的连接方言 --> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!-- 配置启动应用时,是否根据Hibernate映射自动创建数据表 --> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <!-- <prop key="hibernate.connection.autocommit">true</prop> --> <!-- <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> --> </props> </property> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource" /> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <context:annotation-config/> <tx:annotation-driven transaction-manager="transactionManager" />
7 年多之前 回复
hehe198504
葛一凡 OpenSessionInView没有配置
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 事务配置 和 具体调用需要查看 另外你配置 OpenSessionInView了吗
7 年多之前 回复
hehe198504
葛一凡 多谢回复。
7 年多之前 回复
hehe198504
葛一凡 我的疑问是,我通过this.sessionFactory.getCurrentSession()得到了session,并使用该session.get()方法,查询出对象A,但是在测试类中,发现可以根据该对象导航出A关联的对象B,而且还输出了查询的sql语句,从这个现象上来看,session并没有及时的关闭,所以我想问该如何配置才能在查询完成后及时关闭session
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian this.sessionFactory.getCurrentSession() : spring已经内部进行处理了,如果当前线程已经绑定session直接取回来用 否则创建一个session绑定到当前线程
7 年多之前 回复
hehe198504
葛一凡 。。。说实话,有点高深了,我只是想解决这个问题,或者发现这个问题的所在
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 要注意session的传播性
7 年多之前 回复
jinnianshilongnian
jinnianshilongnian 如果没有配置事务 session会自动关闭 如果配置事务 会在打开session的位置关闭session 如果你配置了OpenSessionInView 则会在退出请求的时候关闭
7 年多之前 回复
hehe198504
葛一凡 您的文章我是拜读过的,不过能否指点一下,告诉我是事务我没有配置上,还是其他的原因,造成session没有关闭?
7 年多之前 回复

return this.sessionFactory.getCurrentSession(); 这种形式 session 是会自己关闭的 ,它是需要 事务的配合 ,事务 commit之后 session 就关闭了

[url]http://navylee.iteye.com/blog/1628280[/url]

hehe198504
葛一凡 很感谢你,问题已经解决了。是unitils这个测试工具中的事务默认是开启造成的
7 年多之前 回复
hehe198504
葛一凡 没,这个就是dao层的,呵呵
7 年多之前 回复
navy0168
navy0168 怎么感觉你写的好乱啊 ,@Transactional @SuppressWarnings("unchecked") public T getById(Serializable id) { return (T)this.getSession().get(this.clazz, id) ; //这个应该是 dao层的吧 ,你放在了 services层 } 2012-08-28 15:14
7 年多之前 回复
hehe198504
葛一凡 恩,是的,的确扫描了。不过我没有在basedao和baseservice两个abstract类中加入注解@Repository和@Service,只是在其具体的实现dao和service中增加了这两个注解,这样应该是正确的吧?
7 年多之前 回复
navy0168
navy0168 你确定 你的 @Transactional 对应的 dao包 是不是注解扫描了 <context:component-scan base-package="com.you" />
7 年多之前 回复
hehe198504
葛一凡 我已经查看了mysql,使用的innodb模式,是支持事务的
7 年多之前 回复
hehe198504
葛一凡 我将方言修改成<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>,发现事务还是没有提交
7 年多之前 回复
navy0168
navy0168 mysql 的 org.hibernate.dialect.MySQL5InnoDBDialect innodb 这个支持
7 年多之前 回复
hehe198504
葛一凡 mysql,不支持事务?
7 年多之前 回复
navy0168
navy0168 你用的 数据库 是什么库 mysql的 myisam 貌似是不支持事务的
7 年多之前 回复
navy0168
navy0168 你确定 你的 @Transactional 对应的 dao包 是不是注解扫描了 <context:component-scan base-package="com.you" />
7 年多之前 回复
hehe198504
葛一凡 我使用的hibernate4的配置 <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <context:annotation-config/> <tx:annotation-driven transaction-manager="transactionManager" />
7 年多之前 回复
navy0168
navy0168 看下 你的 事务配置 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <context:annotation-config/> <tx:annotation-driven transaction-manager="transactionManager" />
7 年多之前 回复
hehe198504
葛一凡 那我执行完查询方法后,应该事务就提交了吧,这样通过getCurrentSession()得到的session实例就自动关闭了,可是为什么我在测试时候发现session并没有关闭呢?是我事务配置的有问题吗
7 年多之前 回复
navy0168
navy0168 是的 ,@Transactional,他会采用 默认的 事务机制, 如果懒得在 每个方法里面写,就直接 写在 Service 类的 前面 ,这样所有的 方法都 用到了,
7 年多之前 回复
hehe198504
葛一凡 请问如何与事务配合,我在配置文件中增加了事务,在get的方法上增加了注解@Transactional,应该就是已经增加了事务吧?
7 年多之前 回复

这个要手动关的!

你把几个概念混淆了。Hibernate和Spring整合之后推荐使用HibernateTemplate这个模板类,它里面封装了Hibernate的Session和相关事务的控制,是不需要我们手动的开关Session的。但是,你的代码里面仍然使用的是Hibernate API中的原始Session(sessionFactory.getCurrentSession()这个语句),这就相当于你用的还是原始的Hibernate,跟整合Spring之前没有一点差别,所以Session的开关还需自己手动控制。希望可以帮到你....

不错,好着

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