@OneToMany 删除孩子

Moa*_*did 3 java spring hibernate

我有两个这样的实体:

public class Client {
  ...
@OneToMany(mappedBy = "client", cascade = { CascadeType.DETACH, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.REMOVE },orphanRemoval = true, fetch=FetchType.EAGER)
@Fetch(value = FetchMode.SUBSELECT)
@Cascade({ org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
private List<CompanyContract> companyContracts;
  ...
}
Run Code Online (Sandbox Code Playgroud)

公司合同:

public class CompanyContract {

...

@ManyToOne
@JoinColumn(name = "IDCLIENT")
private Client client;

...
}
Run Code Online (Sandbox Code Playgroud)

我想删除这样的 companyContract :

client.getCompanyContracts().remove(companyContract)
client = clientService.updateClient(client);
Run Code Online (Sandbox Code Playgroud)

但是删除过程没有发生

我究竟做错了什么 ?

编辑

这是我的 DAO 中的 updateClient 方法:

@Override
@Transactional
public Client updateClient(Client client) {

    return entityManager.merge(client);
}
Run Code Online (Sandbox Code Playgroud)

Jak*_*ała 6

首先,您不需要 setcascadeTypes@Cascade。我认为这可能是您问题的根源。

你有没有override equalshashCodeContractCompany?因为也许您没有从中删除所需的对象List<ContactCompany>

看这个

@OneToMany(mappedBy = "client", ...)
Run Code Online (Sandbox Code Playgroud)

mappedBy通知休眠客户端是此关系的所有者,因此您需要获取client、获取 列表clientContracts、删除一个(确保它已从列表中删除)、更新客户端并删除对象。

下面的示例源代码

CompanyContract toBeRemoved = //companyContract which you want to delete
client.getCompanyContracts().remove(toBeRemoved);
toBeRemoved.client = null;
Run Code Online (Sandbox Code Playgroud)

保存两个对象,toBeRemoved以及client