@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
equals
和hashCode
吗? 因为您可能没有从List
删除所需的对象
看这个
@OneToMany(mappedBy = "client", ...)
mappedBy
通知hibernate客户端是此关系的所有者 ,因此您需要获取client
,获取clientContracts
列表,删除一个(确保将其从列表中删除),更新客户端和删除对象。
示例源代码如下
CompanyContract toBeRemoved = //companyContract which you want to delete client.getCompanyContracts().remove(toBeRemoved); toBeRemoved.client = null;
保存两个对象, toBeRemoved
和client
尝试使用这些注释:
@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=?
-
使用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”来执行此类任务。
参考