【问题标题】:Why is having FetchType.EAGER preventing the deletion of an object?为什么让 FetchType.EAGER 阻止删除对象?
【发布时间】:2017-12-01 11:17:57
【问题描述】:

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

@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();
}

【问题讨论】:

  • 如何删除?抛出任何错误? p.s.急切是非收集的默认值
  • 没有任何错误。但是,当我创建自定义删除方法时,会抛出一个奇怪的 Transastionrequired 错误,我已在此线程中对此进行了详细说明。 stackoverflow.com/questions/47549043/… 但是当我使用 jparepository 的常规内置删除功能时,它不会抛出任何错误
  • 是的,把这段代码放在你做删除的地方
  • 我想它是用@Transactional 注释的吧?
  • 不,它不是,使用弹簧数据它不需要使用@Transactional

标签: java hibernate spring-data


【解决方案1】:

我找到了问题的原因

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2018-05-22
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多