@OneToMany删除子项

我有两个这样的实体:

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 companyContracts; ... } 

公司合同:

 public class CompanyContract { ... @ManyToOne @JoinColumn(name = "IDCLIENT") private Client client; ... } 

我想删除像这样的companyContract:

 client.getCompanyContracts().remove(companyContract) client = clientService.updateClient(client); 

但删除过程没有发生

我究竟做错了什么 ?

编辑

这是我的DAO中的updateClient方法:

 @Override @Transactional public Client updateClient(Client client) { return entityManager.merge(client); } 

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

你在ContractCompany override equalshashCode吗? 因为您可能没有从List删除所需的对象

看这个

 @OneToMany(mappedBy = "client", ...) 

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

示例源代码如下

 CompanyContract toBeRemoved = //companyContract which you want to delete client.getCompanyContracts().remove(toBeRemoved); toBeRemoved.client = null; 

保存两个对象, toBeRemovedclient

尝试使用这些注释:

 @OneToMany(mappedBy = "client", cascade = CascadeType.ALL,orphanRemoval = true, fetch=FetchType.EAGER) private List companyContracts; 

Cascade delete-orphan示例如果您只想删除两个引用的’stockDailyRecords’记录? 这叫做孤儿删除,见例子……

 1. No delete-orphan cascade You need to delete the 'stockDailyRecords' one by one. StockDailyRecord sdr1 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(56)); StockDailyRecord sdr2 = (StockDailyRecord)session.get(StockDailyRecord.class, new Integer(57)); session.delete(sdr1); session.delete(sdr2); Output Hibernate: delete from mkyong.stock_daily_record where DAILY_RECORD_ID=? Hibernate: delete from mkyong.stock_daily_record where DAILY_RECORD_ID=? 
  1. 使用delete-orphan cascade在’stockDailyRecords’中声明cascade =“delete-orphan”以启用删除孤立级联效果。 当您保存或更新股票时,它将删除那些已标记为已删除的’stockDailyRecords’。

     Stock stock = (Stock)session.get(Stock.class, new Integer(2)); stock.getStockDailyRecords().remove(sdr1); stock.getStockDailyRecords().remove(sdr2); session.saveOrUpdate(stock); 

    产量

    Hibernate:从mkyong.stock_daily_record中删除DAILY_RECORD_ID =? Hibernate:从mkyong.stock_daily_record中删除DAILY_RECORD_ID =?

简而言之,delete-orphan允许父表删除其子表中的少数记录(删除孤立)。

您应该使用cascade =“delete-orphan”来执行此类任务。

参考