Spring Data JPA:deleteById不会从数据库中删除记录,但派生的删除方法会

Rob*_*uch 3 spring jpa spring-data-jpa

我在 Spring 应用程序中观察到一种奇怪的行为。不幸的是我无法分享完整的代码,但基本上是这样的:

// the repository
@Repository
public interface InboxRepo extends JpaRepository<Inbox, Long> {}

// the service
@Transactional
public void deleteInbox(long id) {
    inboxRepo.deleteById(id);
}
Run Code Online (Sandbox Code Playgroud)

调用时deleteInbox(),没有异常或任何类型的错误,但该Inbox项目不会从数据库中删除。设置spring.jpa.show-sql=true显示甚至没有一条DELETE语句,即无论出于何种原因,代码实际上并没有发出删除操作。

在存储库中定义派生删除方法时,删除会起作用,但对我来说还没有意义:

@Repository
public interface InboxRepo extends JpaRepository<Inbox, Long> {

    // this seems to work
    @Modifying
    @Query("delete from Inbox i where i.id = ?1")
    void delete(long id);
}
Run Code Online (Sandbox Code Playgroud)

直接通过删除EntityManager也可以。JpaRepository但“标准”方法在这里不起作用的原因可能是什么?

Rob*_*uch 5

我找到了根本原因。Inbox还有另一个实体有这样的引用:

@OneToMany(mappedBy = "inbox", cascade = ALL, fetch = FetchType.EAGER)
private Set<Inbox> inbox = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

与级联结合FetchType.EAGER导致了问题,即一旦Inbox删除,此引用就会导致Inbox“重新保留”。设置FetchType.LAZY解决了问题。