2

我正在尝试手动删除实体集合中的每个实体。问题是,实体不会从数据库中删除,即使它们已从任务的集合中删除。

下面是我用来实现这一点的代码:

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

有任何想法吗?

PS集合表示为:

@OneToMany(targetEntity = DataStoreCost.class, mappedBy = "task", cascade = CascadeType.ALL)
private Collection<DataStoreCost> costs;

干杯。

4

2 回答 2

1

它没有删除实体,因为它不知道是否有其他东西在引用它。

您需要启用删除孤儿。在 jpa2 中,使用orphanRemoval属性。如果您使用的是休眠注释,请使用 CascadeStyle 删除孤儿。

于 2012-11-30T13:34:08.500 回答
1

我认为您需要Cost通过entityManager. 当您CostTasks成本列表中删除时,您实际上只删除了对该实例的引用。它不知道该特定Cost内容不会在其他任何地方使用。

于 2012-11-30T13:35:20.403 回答