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

时间:2017-12-01 11:17:58

标签: java hibernate spring-data

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

SELECT * FROM cities WHERE name != 'New York' and name IN ('Berlin', 'Bonn', 'Munchen');

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

我无法再从数据库中删除LeaveQuery。当我将两侧的FetchType.EAGER更改为LAZY时,它会成功删除,但我需要双方都使用FetchType.EAGER。

有没有人有解决方法呢?

此致

编辑:

继承我的删除代码:

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

1 个答案:

答案 0 :(得分:0)

我找到了问题的原因

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

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

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

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