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但“标准”方法在这里不起作用的原因可能是什么?
我找到了根本原因。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解决了问题。
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |