2016-06-12 19 views
0

Ich habe Dokumente, die von anderen Dokumenten referenziert werden. Ich speichere diese Verbindung in der Entität.JPA - Löschen von Elementen aus @ManyToMany self

@Entity 
public class Document extends AbstractEntity { 

    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
    @JoinTable(name = "DREF", joinColumns = 
    @JoinColumn(name = "DOCID", referencedColumnName="ID"), inverseJoinColumns = 
    @JoinColumn(name = "REFBYDOCID", referencedColumnName="ID")) 
    private Set<Document> referencedBy = new HashSet<Document>(); 

} 

Aber ich habe Probleme, wenn ich versuche zu löschen.

Zum Beispiel: Wenn Doc1 von Doc2 referenziert wird, kann ich Doc2 nicht löschen.

Dazu muss ich Doc2 aus den anderen Dokumenten referenziertenBy Sets entfernen. Aber ich kann die Referenz dieser Dokumente von Doc2 nicht bekommen.

1) Ich habe versucht, eine Methode zu schreiben, um die Referenzen zu bekommen, aber ich konnte es nicht tun.

2) Ich habe versucht, die referenzierten Dokumente zu speichern, aber es war eine Sackgasse.

Wie soll ich das tun?

Antwort

1

Sie könnten die inverse Seite des Vereins speichern:

@ManyToMany(mappedBy = "referencedBy") 
private Set<Document> referencedDocuments = new HashSet<>(); 

Oder Sie könnten eine Abfrage schreiben, um alle Dokumente zu finden, um das Dokument referenziert zu löschen:

select doc1 from Document doc1 
join doc1.referencedBy doc2 
where doc2.id = :doc2Id 

Sie sollten vermeiden, die Verwendung von Kriterien-API, wenn Sie keine dynamische Abfrage basierend auf mehreren ... Kriterien erstellen müssen. JPQL ist viel einfacher zu schreiben, zu lesen und zu verstehen.