2012-11-30 105 views
2

我試圖手動刪除實體集合中的每個實體。問題是,實體不會從數據庫中刪除,即使它們從任務的集合中刪除。從休眠集合中刪除實體

下面是使用代碼IM來實現這一目標:

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; 

乾杯。

回答

1

它不會刪除該實體,因爲它不知道其他內容是否指向該實體。

您需要啓用刪除孤兒。在jpa2中,使用orphanRemoval屬性。如果您使用的是hibernate註釋,請使用CascadeStyle刪除orphan。

1

我認爲你需要通過entityManager明確刪除Cost實體。當您從Tasks費用列表中刪除Cost時,實際上只刪除對該實例的引用。它不知道該特定的Cost將不會在其他地方使用。

+0

是的,在for循環中調用'entityManager.remove(cost);'。 – Kai