Un problema che spesso mi trovo ad affrontare con Hibernate è avere una lista (chiamala listaA) di oggetti che voglio perseguire contro un'entità (myEntity) ma dovendoli prima confrontare l'elenco esistente sull'entità ed elimina quelli che non sono in elencoA.Ibernazione: il modo migliore per eliminare elementi in una raccolta
Il modo semplice per eseguire questa operazione è cancellare l'elenco sull'entità e aggiungere semplicemente tutta l'elencoA all'entità, tuttavia spesso devo eseguire alcune convalida sugli elementi prima che vengano eliminati, ad es. per verificare se questo utente è autorizzato a eliminarli.
mio approccio attuale si sente a disagio:
//Delete the elements that have been removed
//Use toArray to avoid ConcurrentModificationException
for(ObjectA a : myEntity.getObjectAList().toArray(new ObjectA[myEntity.getObjectAList().size()])) {
if(!listA.contains(a)) {
//Check if this element can be deleted
if(canDelete(a)) {
entityManager.remove(a);
myEntity.getObjectAList().remove(a);
}
}
}
//Add the elements that don't already exist
for(ObjectA a : listA) {
if(!myEntity.getObjectAList().contains(a)) {
myEntity.getObjectAList().add(a);
}
}
Qualsiasi margini di miglioramento?
Grazie.
Non riesco a utilizzare removeAll() poiché è necessario eseguire una convalida rispetto agli elementi singolarmente prima cancellandoli. Grazie per il suggerimento Iterator però. – Damo
Penso che il punto di removeAll fosse che avrebbe ridotto l'elenco sull'oggetto a quelli che è necessario controllare per l'eliminazione. Poi controlli tutti quelli e rimuovi se permesso. Quindi puoi aggiungere tutto il listA senza controllare per vedere se sono già lì perché li hai già rimossi. – digitaljoel