我发现了一些非常奇怪的事情。当我使用注释时
@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();
}
我已经找到了问题的原因
如果父对象仍然在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。