@Modifying(clearAutomatically = true)
@Transactional(rollbackFor = Exception.class)
@Query("update User set name=:name, age=:age where id=:id")
void updateUserInfo(@Param("name") String name, @Param("age") Integer age, @Param("id") Integer id);
注意:在使用@Modifying注解时,如果忘了加 @Transactional注解可能会报错
@Modify注解
可以清除底层持久化上下文,就是entityManager这个类,jpa底层实现会有二级缓存,也就是在更新完数据库后,如果后面去用这个对象,再去查这个对象,这个对象是在一级缓存,但是并没有跟数据库同步,这个时候用clearAutomatically=true,就会刷新hibernate的一级缓存, 不然在同一接口中,更新完一个对象,接着查询这个对象,那么查出来的这个对象还是没更新之前的状态。
@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。
注解说明:
在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚
使用场景说明:
带 SQL 事务代码得的时候才使用 。