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

    public Date date; 
    public double availability; 

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

W jednym z moich zadań Mam następujący kod:Jak mogę kaskadować usuwanie kolekcji, która jest częścią jednostki jpa?

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

To zawsze kończy się niepowodzeniem, aby usunąć podmiot z powodu następującego błędu:

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

Jak mogę określić odwzorowanie dlatego uwagi elementy z kolekcji kategorii są usuwane po usunięciu raportu?

+0

JPA nie obsługuje kaskadowych usunięć w elementcollections (zobacz także [tutaj] (http://stackoverflow.com/q/3903202/741249)). – THelper

Odpowiedz

26

Usuwanie kaskadowe (i ogólnie operacje kaskadowe) jest skuteczne tylko wtedy, gdy operacja odbywa się za pośrednictwem EntityManager. Nie wtedy, gdy usuwanie jest wykonywane jako usuwanie zbiorcze za pomocą kwerendy JP QL/HQL. Nie można określić odwzorowania, które usunąłoby łańcuch do elementów w ElementCollection, gdy usuwanie odbywa się za pomocą zapytania.

ElementCollection adnotacja nie ma atrybutu kaskady, ponieważ operacje są zawsze kaskadowane. Po usunięciu encji za pomocą EntityManager.remove(), operacja jest kaskadowana do ElementCollection.

Musisz pobrać wszystkie obiekty MonthlyReport, które chcesz usunąć i wywołać EntityManager.remove dla każdego z nich. Wygląda na to, że zamiast tego w środowisku Play możesz wywołać metodę delete w encji.

+0

Jaki byłby właściwy sposób usuwania kategorii? Zauważyłem, że jeśli ustawię klucz obcy na kaskadowanie w samej bazie danych, MonthyReport.delete faktycznie się powiedzie. – emt14

+0

Dodano do odpowiedzi, wystarczy pobrać je z datą =? -criteria i usuń/usuń jeden po drugim. Następnie usuwanie będzie kaskadowane do kategorii. –

+0

To bardzo ładnie poradziło. dzięki. – emt14