Java 为什么FetchType.EAGER会阻止删除对象?

Java 为什么FetchType.EAGER会阻止删除对象?,java,hibernate,spring-data,Java,Hibernate,Spring Data,我发现了一件非常奇怪的事。当我使用注释时 @OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true) List<LeaveQuery> leaveQueryList; 我无法再从数据库中删除LeaveQuery。当我将任意一侧的FetchType.EAGER更改为LAZY时,它将成功删除,但我需要两侧都使用FetchType.EA

我发现了一件非常奇怪的事。当我使用注释时

@OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
List<LeaveQuery> leaveQueryList;
我无法再从数据库中删除LeaveQuery。当我将任意一侧的FetchType.EAGER更改为LAZY时,它将成功删除,但我需要两侧都使用FetchType.EAGER

有人对此有解决办法吗

问候

编辑:

这是我的删除代码:

public ResponseEntity<?> delete(@PathVariable long custId) {
    log.info("entering deleteleaverequest");
    LeaveQuery deleteLeaveQuery = leaveQueryRepository.findOne(custId);
    log.info("condition" + deleteLeaveQuery.getStatus().equals("Onbehandeld"));
    if (!deleteLeaveQuery.getStatus().equals("Onbehandeld"))
        return ResponseEntity.badRequest().build();

    leaveQueryRepository.delete(deleteLeaveQuery);
        accountService.sendLeaveRequestCanceledNotification(deleteLeaveQuery);
    return ResponseEntity.ok().build();
}
public ResponseEntity delete(@PathVariable long custId){
log.info(“输入删除请求”);
LeaveQuery deleteLeaveQuery=leaveQueryRepository.findOne(客户ID);
log.info(“条件”+deleteLeaveQuery.getStatus().equals(“onBehandled”));
如果(!deleteLeaveQuery.getStatus().equals(“OnBehandled”))
返回ResponseEntity.badRequest().build();
levequeryrepository.delete(deleteLeaveQuery);
accountService.sendLeaveRequestCanceledNotification(deleteLeaveQuery);
返回ResponseEntity.ok().build();
}

我已找到问题的原因

如果父对象仍在Hibernate的持久化上下文中,则Hibernate不会删除该子对象(在我的示例中是Account,leaveQuery是leaveQuerylist中的子对象)。所以我通过应用这个代码解决了我的问题

deleteLeaveQuery.getAccount().getLeaveQueryList().removeIf(a-> a.getId() == custId);
在从帐户中的leaveQuery列表中删除我要删除的leaveQuery后,我能够成功删除


删除leaveQuery的另一种方法是首先获取与此leaveQuery关联的帐户,然后从LeaveQueryList中删除leaveQuery,然后保存该帐户。如果帐户在其OneToMany批注中有CascadeType.ALL,它将自动从数据库中删除从列表中删除的leavequery。

如何删除?有什么错误吗?p、 s.eager是非收集的默认值无任何错误。。然而,当我创建一个自定义的delete方法时,抛出了一个奇怪的TransationRequired错误,我在这个线程中对此进行了详细阐述。但是当我使用jparepository的常规内置delete函数时,它不会抛出任何错误是的,将代码放在执行删除的地方,我想它是用@Transactional注释的,对吗?不,不是,用spring数据不必使用@Transactional
deleteLeaveQuery.getAccount().getLeaveQueryList().removeIf(a-> a.getId() == custId);