java - spring 事务管理不起作用

标签 java spring hibernate configuration transactions

我在 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/

相关文章:

java - 用于打印 key 的 getGenerateKeys() 不起作用。为什么?

java - 测试时使用数据源的 Spring Boot

spring - 我无法获取 JDBC 连接异常

java - 在eclipse中获取项目的实际物理路径

java - 收到错误消息说类未与命名查询映射

java - 尝试使用 eclipse 和 hibernate 5 连接到 mysql 数据库

java - ListSelectionListener 将无法正常工作

java - 安卓 E/Trace(627) : error opening trace file: No such file or directory (2)

java - NullPointerException 从构造函数启动时

java - 尽管有DirtiesContext.ClassMode.BEFORE_CLASS,SpringBootTest中的MockBean仍取决于执行顺序