spring-data-jpa@Modifying需要加@Transactional的原因

spring-data-jpa@Modifying需要加@Transactional的原因

前段时间做后端开发的时候遇到了一个问题,在jpa开发里面对单个字段进行修改的时候,总是出问题。后来寻得答案,来写一个总结。

默认情况下,repository 接口中的CRUD方法都是被@Transactional注解修饰了的。读的操作方法,@Transactional注解的readOnly属性是被设置为true的,就是只读状态;CRUD中的其他方法被@Transactional修饰,就是非只读。如果你需要修改repository 接口中的某些方法的事务属性,可以在该方法上重新加上@Transactional注解,并设置需要的属性。
附上SpringDataJPA官方文档:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

事务查询方法
(该截图来自官方文档翻译后的)

上代码:

	@Transactional//事务注解
    @Modifying
    @Query("update Iss i set i.status =:status where i.id =:id")
    void revoke(String status,String id);

加上事务注解后,就能更改指定的字段了。

我觉得这个博主大大的解释很好,附上链接(https://www.cnblogs.com/nongzihong/p/10882402.html)
这段话的大致意思是默认情况下JPA的每个操作都是事务的,在默认情况下,JPA的事务会设置为只读,具体可以参考SimpleJpaRepository。
这样@Modifying和@Transactional为什么配合才能使用的原因就很明显了,实质上@Modifying只是声明了这个操作是一个修改操作,但却没有修改这个方法的事务等级,因此这个方法依然不能进行修改操作。只有声明了@Transactional,本质上是声明了@Transactional(readOnly=false),这样覆盖了默认的@Transactional配置便可以执行修改操作了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值