Spring数据JPA:deleteById不会从数据库中删除记录,但派生的delete方法会删除记录
我在Spring应用程序中观察到一种奇怪的行为。不幸的是,我无法分享完整的代码,但基本上是这样的:Spring数据JPA:deleteById不会从数据库中删除记录,但派生的delete方法会删除记录,spring,jpa,spring-data-jpa,Spring,Jpa,Spring Data Jpa,我在Spring应用程序中观察到一种奇怪的行为。不幸的是,我无法分享完整的代码,但基本上是这样的: //存储库 @存储库 InboxRepo的公共接口扩展了JpaRepository{} //服务 @交易的 公共无效删除收件箱(长id){ inboxRepo.deleteById(id); } 调用deleteInbox()时,没有异常或任何类型的错误,但不会从数据库中删除Inbox项。设置spring.jpa.show sql=true表明甚至没有DELETE语句,也就是说,无论出于何种原因
//存储库
@存储库
InboxRepo的公共接口扩展了JpaRepository{}
//服务
@交易的
公共无效删除收件箱(长id){
inboxRepo.deleteById(id);
}
调用deleteInbox()
时,没有异常或任何类型的错误,但不会从数据库中删除Inbox
项。设置spring.jpa.show sql=true
表明甚至没有DELETE
语句,也就是说,无论出于何种原因,代码实际上不会发出删除命令
在存储库中定义派生的delete方法时,删除会起作用,但对我来说还没有意义:
@存储库
InboxRepo的公共接口扩展了JpaRepository{
//这似乎有效
@修改
@查询(“从收件箱i中删除,其中i.id=?1”)
作废删除(长id);
}
直接通过
EntityManager
进行数据传输也有效。但是“标准”的否定方法在这里不起作用的原因是什么呢?我找到了根本原因。另一个实体引用了收件箱,如下所示:
@OneToMany(mappedBy=“收件箱”,cascade=ALL,fetch=FetchType.EAGER)
private Set inbox=new HashSet();
FetchType.EAGER
与级联一起导致了问题,即只要删除了收件箱
,该引用就会导致收件箱
重新持久化。设置FetchType.LAZY
解决了问题。其他回购方法工作正常吗?是的,其他回购工作正常。我怀疑这是某种相关实体…问题是关于同一回购的其他方法,而不是关于其他回购),但不介意)考虑到deleteById
内部确实存在findById
(并且EmptyResultDataAccessException
将在实体缺失时抛出)您是否在日志中看到生成的选择…
查询?如果没有,则可能实际生成并执行了delete
查询,但由于某些原因,实体未被删除。