我正在尝试手动删除实体集合中的每个实体。问题是,实体不会从数据库中删除,即使它们已从任务中的集合中删除。
以下是用于实现此目的的代码:
public int removeExistingCosts(final DataStoreTask task) {
int removedAccumulator = 0;
Query query = entityManager.createNamedQuery(DataStoreCost.GET_COSTS_FOR_TASK);
query.setParameter(DataStoreCost.TASK_VARIABLE_NAME, task);
try {
List costsForTask = query.getResultList();
for(Object cost : costsForTask) {
task.getCosts().remove(cost);
removedAccumulator++;
}
} catch (NoResultException e) {
logger.debug("Couldn't costs for task: {}", task.getId());
}
entityManager.flush();
entityManager.persist(task);
return removedAccumulator;
}
有什么想法吗?
P.S该集合表示为:
@OneToMany(targetEntity = DataStoreCost.class, mappedBy = "task", cascade = CascadeType.ALL)
private Collection<DataStoreCost> costs;
干杯。
答案 0 :(得分:1)
它不会删除实体,因为它不知道是否还有其他内容。
您需要启用删除孤立。在jpa2中,使用orphanRemoval属性。如果您正在使用hibernate注释,请使用CascadeStyle delete orphan。
答案 1 :(得分:1)
我认为您需要通过Cost
明确删除entityManager
实体。从Cost
费用列表中删除Tasks
时,实际上只删除了对该实例的引用。它不知道特定的Cost
将不会在其他任何地方使用。