Spring Framework 5如何恢复Spring4事务行为:仅@Transactional内修改刷库
恢复Spring Framework 4的实体变更刷库行为(迁移至Spring 5后)
在Spring Framework 5中,非事务方法内修改托管实体后自动刷库是预期行为,但可以通过以下配置恢复Spring 4的原有逻辑——仅在@Transactional标注的方法内才触发数据库刷库:
方案1:设置Hibernate Flush模式为COMMIT
Hibernate的COMMIT flush模式仅在事务提交时执行刷库操作,非事务环境下的实体修改不会自动同步到数据库。在配置文件中添加:
application.properties
spring.jpa.properties.hibernate.flushMode=COMMIT
原生Hibernate配置(若未使用Spring Data JPA)
hibernate.flushMode=COMMIT
方案2:调整OpenEntityManagerInView组件的Flush模式
如果项目使用了OpenEntityManagerInViewFilter或OpenEntityManagerInViewInterceptor(常见于解决视图层懒加载场景),Spring 5默认会保持EntityManager会话打开并允许自动刷库。可以通过修改其flush模式来改变行为:
XML配置方式
<bean id="openEntityManagerInViewInterceptor" class="org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor"> <property name="entityManagerFactory" ref="entityManagerFactory"/> <property name="flushMode" value="COMMIT"/> </bean> <mvc:interceptors> <ref bean="openEntityManagerInViewInterceptor"/> </mvc:interceptors>
Java配置方式
@Configuration public class WebMvcConfig implements WebMvcConfigurer { @Autowired private EntityManagerFactory entityManagerFactory; @Override public void addInterceptors(InterceptorRegistry registry) { OpenEntityManagerInViewInterceptor interceptor = new OpenEntityManagerInViewInterceptor(); interceptor.setEntityManagerFactory(entityManagerFactory); interceptor.setFlushMode(FlushMode.COMMIT); registry.addInterceptor(interceptor); } }
方案3:自定义JpaTransactionManager
通过自定义事务管理器,全局设置默认flush模式为COMMIT,确保仅事务内的变更会被刷库:
@Bean public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory); transactionManager.setDefaultFlushMode(FlushMode.COMMIT); return transactionManager; }
验证方法
- 执行无
@Transactional标注的修改方法(如示例2),确认数据库未更新; - 执行带
@Transactional标注的修改方法(如示例1),确认数据库正常更新。
内容的提问来源于stack exchange,提问作者T4puSD
相关产品推荐
相关产品推荐

