Spring Data JPA @Modifying注解与@Transactional搭配使用相关问题
问题1:使用@Modifying注解时是否需要搭配@Transactional?
必须搭配。JPA规范要求所有数据库变更操作(增删改)都必须在事务环境中运行,而Spring Data JPA默认给查询方法配置的是只读事务,无法支持变更操作。如果不添加事务直接运行@Modifying标记的方法,会直接抛出TransactionRequiredException异常。
实际使用时@Transactional可以加在Repository层的对应方法上,也可以加在业务层调用该Repository方法的方法上,更推荐加在业务层,方便统一管理事务边界,避免多个数据库操作拆分到不同事务的问题。
问题2:@Modifying的具体作用是什么?
@Modifying是Spring Data JPA用来标记非查询类数据库操作的注解,核心作用如下:
- 告知Spring Data JPA当前方法不是普通的SELECT查询,底层需要调用JPA的
executeUpdate()方法执行DML/DDL语句,而不是用查询类的getResultList()/getSingleResult()方法执行。没有加这个注解的方法如果写的是UPDATE/DELETE语句,运行时会直接报错。 - 支持配置变更操作后的持久上下文行为:
- 你用到的
clearAutomatically = true:方法执行完成后自动清空当前EntityManager的持久上下文,清除缓存的实体数据,避免后续查询拿到和数据库不一致的旧缓存值。 - 你用到的
flushAutomatically = true:执行当前变更方法前,自动把EntityManager中所有未同步到数据库的待提交变更flush到数据库,避免未提交的本地变更和你要执行的更新操作产生数据冲突。
- 你用到的
注意@Modifying仅支持搭配@Query自定义的JPQL或原生SQL语句使用,不支持JPA自动推导的方法名语法。
内容的提问来源于stack exchange,提问作者user17186249
相关产品推荐
相关产品推荐

