2009-07-09 9 views
1

Ich versuche herauszufinden, wie Sie eine Massenlöschung in einer @ ManyToOne-Beziehung ausführen, bisher ohne Erfolg.So führen Sie Bulk-Delete mit Beziehung in EJB3 aus

Szenario:

Elternteil viele Downloads hat, möchte ich eine Löschen aller Downloads auszuführen, wo die Eltern Date > :some_date ist. Ich möchte keine der übergeordneten Datensätze löschen, sondern nur die Datensätze herunterladen. Der Download enthält ein übergeordnetes Feld, das mithilfe einer @ManyToOne-Annotation zugeordnet wird.

Ich versuche, eine @namedQuery auf die Download-Entität zu verwenden, um dies zu erreichen.

//this OQL tries to delete from both the child and parent tables 
//I only want to delete from the Download table 
DELETE FROM Download dwn 
    WHERE dwn.acctId = :acctId AND dwn.parent.date > :date 

//this OQL is invalid and will keep the bean from deploying 
//The example I found used this sub query but with a @OneToMany relationship 
//instead of a @ManyToOne relationship 
//this is what i get for an error on deployment: 
//"Errors in named queries: deleteByAccountIdAndDownloadedDate" 
DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p from dwn.parent WHERE p.date > :date) 
    AND dwn.acctId = :acctId 

Irgendwelche Vorschläge?

Antwort

0

Ich war in der Lage, die Massenlöschung zu arbeiten, indem Sie die Annotation @ManyToOne entfernen und sie nur mit der langen parentId ersetzen. Dann habe ich die Unterauswahl geändert, um den Parent-Namen anstelle des Felds zu verwenden.

Jetzt sieht die OQL wie folgt aus:

DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p FROM Parent p WHERE p.id = dwn.parentId and p.date > :date) 

Ich habe es nicht versuchen, (weil ich nicht Abfragefunktionen für benötigen, was ich tue), aber wenn kann es die @ManyToOne verlassen arbeiten und benutze diesen OQL:

DELETE FROM Download dwn WHERE EXISTS 
    (SELECT p FROM Parent p WHERE p.id = dwn.parent.id and p.date > :date) 
1

Ich würde bei der ersten Annäherung bleiben. Wird eine Fehlermeldung angezeigt?

Wenn es um Eltern Datensätze zusammen mit Downloads gelöscht wird ... Sind Sie sicher, dass Sie keine Kaskade auf die Beziehung zwischen ihnen haben?

+0

Ich werde die Kaskadeneinstellungen von meinem DBA überprüfen. –

+0

Bitte beachten Sie, dass die Kaskadierung sowohl auf JPA-Ebene (beim Definieren von Relationen) als auch in der DB angegeben werden kann. –

Verwandte Themen