提问者:小点点

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


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

@OneToMany(fetch = FetchType.EAGER, mappedBy = "account", cascade = CascadeType.ALL, orphanRemoval = true)
List<LeaveQuery> leaveQueryList;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "FK_account", nullable = true)
private Account account;

我不再能够从数据库中删除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();
}

共1个答案

匿名用户

我已经找到了问题的原因

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

deleteLeaveQuery.getAccount().getLeaveQueryList().removeIf(a-> a.getId() == custId);

从Account中的LeaveQuery列表中删除我要删除的leaveQuery后,我能够成功删除。

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