Spring Data JPA的deleteByXXXX,delete语句执行的疑问

zoemak 发布于 2016/03/04 18:40
阅读 11K+
收藏 0


@Transactional
    List<Coupon> deleteByCode(String code);


Spring Data JPA的deleteByXXXX,是先select,在整个Transaction完了之后才执行delete。

我的需求是,删除数据后,再insert新的数据,并且数据是有唯一性约束的。

那么问题来了:

1、因为增删的数据太多,我不想要select那么多再delete

2、如果按照上面的方法,deleteBy之后,立马save新的,会造成唯一性冲突,因为jpa是在整个事务完了之后再执行delete语句的。

针对这个问题,需要改成:


@Transactional
    @Modifying
    @Query("delete from Coupon where code = :code")
    List<Coupon> deleteByCode(@Param("code") String code);

此时才立即执行delete语句。

但是,这么做我觉得有点太多余了,明明都用上JPA了,明明是最简单的CRUD,我却还要费时间去写jpql。。。

求大神解释一下,为什么Spring JPA要这么做吗?

加载中
0
zoemak
zoemak
没人回答,郁闷。。。
0
googlespot
googlespot

org.springframework.data.repository.support.CrudRepositoryInvoker 的invokeDelete方法如下:

@Override
public void invokeDelete(Serializable id) {


if (customDeleteMethod) {
super.invokeDelete(id);
} else {
repository.delete(convertId(id));
}
}

中的if (customDeleteMethod)就说明所有的问题


0
forai
forai
楼主,解决了吗这个问题。我也遇到了。不知道怎么处理。
zoemak
zoemak
问题描述中已经有答案了啊,你想怎么处理?
0
t
tiesuiya

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#dependencies.train-names

ctrl+f搜索:Example 6. Derived Delete Query

有段代码:

public interface UserRepository extends CrudRepository<User, Long> {

  Long deleteByLastname(String lastname);

  List<User> removeByLastname(String lastname);

}

那个removeByLastname,可能是你想要的

0
h
honglei915

执行完delete方法之后,flush一下: 

userRepository.deleteByLastname("peter");
userRepository.flush();
返回顶部
顶部