我在 Spring 使用程序化事务管理,现在我已经切换到声明式事务管理。
session 工厂
<beans:bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource" />
<beans:property name="packagesToScan" value="com.hcentive.cig.domain" />
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.hbm2ddl.auto">update</beans:prop>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
事务管理器
<beans:bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<beans:property name="sessionFactory">
<beans:ref bean="sessionFactory" />
</beans:property>
</beans:bean>
现在如果运行我的代码
@Override
@Transactional
public Request saveRequest(Request request) {
sessionFactory.getCurrentSession().save(request);
return request;
}
I get exception save is not valid without an active transaction
如果我删除下面的行
<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop>
我明白了
No CurrentSessionContext configured!
最佳答案
你绝对不需要这个设置:
<beans:prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</beans:prop>
Spring 事务管理层应该将 Hibernate Session 绑定(bind)到当前运行的线程。
设置没问题,唯一可能导致它的原因来自你的这句话:
no it is getting called from service layer , and also I have tried moving @ transactional to service layer
你需要公开这个方法:
Request saveRequest(Request request);
通过服务接口(interface),您可以将其注入(inject)任何其他组件(网络或其他服务层 bean)。
要验证这一点,您可以在 saveRequest
方法实现中放置一个调试断点,并查找 TransactionInterceptor向上调用堆栈。如果它不存在,则 Spring 无法将您的方法调用包装到事务方面处理逻辑中。
关于java - spring 事务管理不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28624052/