2011-10-08 6 views
15
@Entity 
public class Report extends Model { 

    public Date date; 
    public double availability; 

    @ElementCollection 
    @Cascade(value={CascadeType.ALL}) 
    public Map<FaultCategory, Integer> categories;  
} 

In uno dei miei lavori ho il seguente codice:Come posso eliminare in cascata una collezione che fa parte di un'entità jpa?

int n = MonthlyReport.delete("date = ?", date); 

questo non riesce sempre a cancellare l'ente con il seguente errore:

The DELETE statement conflicted with the REFERENCE constraint "FK966F0D9A66DB1E54". The conflict occurred in database "TFADB", table "dbo.MonthlyReport_categories", column 'MonthlyReport_id'.

Come è possibile specificare la mappatura in modo che il gli elementi della raccolta di categorie vengono eliminati quando il report viene eliminato?

+0

JPA non supporta le eliminazioni a cascata sulle raccolte di elementi (vedere anche [qui] (http://stackoverflow.com/q/3903202/741249)) – THelper

risposta

26

Elimina in cascata (e operazioni in sequenza in generale) è efficace solo quando l'operazione viene eseguita tramite EntityManager. Non quando l'eliminazione viene eseguita come eliminazione collettiva tramite la query JP QL/HQL. Non è possibile specificare la mappatura che eseguirà la rimozione a catena degli elementi in ElementCollection quando la rimozione viene eseguita tramite query.

ElementCollection l'annotazione non ha attributo in cascata, perché le operazioni sono sempre in cascata. Quando si rimuove l'entità tramite EntityManager.remove(), l'operazione viene concatenata allo ElementCollection.

È necessario recuperare tutte le entità MonthlyReport che si desidera eliminare e chiamare EntityManager.remove per ciascuna di esse. Sembra invece che in questo framework Play puoi anche chiamare il metodo delete nell'entità.

+0

Quindi quale sarebbe il modo giusto per eliminare le categorie? Ho notato che se si imposta la chiave esterna in cascata sul database stesso, il MonthyReport.delete ha effettivamente esito positivo. – emt14

+0

Aggiunto per rispondere, è sufficiente recuperarli con la data =? -criteria e rimuovere/eliminare uno per uno. Quindi l'eliminazione verrà collegata in cascata alle categorie. –

+0

Questo ha fatto il trucco molto bene. Grazie. – emt14

Problemi correlati