So prüfen Sie, ob auf das Objekt vor dem Löschen verwiesen wird

8

Ich habe Java-Anwendung mit Web-Schnittstelle (Spring MVC) mit Hibernate. Ich habe hier ein recht einfaches DB-Schema mit einer Entität Group , die Sie auf einer Webseite hinzufügen / löschen können. Dann gibt es eine andere Entity mit Group als Feld dafür Entity hat eine FK to Group . Beachten Sie, dass möglicherweise viele andere Entitäten auf meine Gruppe verweisen.

Wenn ich Group -Objekt löschen möchte, kann es bei FK-Constraint fehlschlagen - die Gruppe wird von einer anderen Entity referenziert.

Gibt es eine Möglichkeit, eine Überprüfung durchzuführen, ob meine Gruppe referenziert ist und der Löschvorgang fehlschlägt, anstatt das Löschen und Abfangen der Ausnahme durchzuführen? Was ist die beste Vorgehensweise hier?

Danke

HINWEIS : Einfach ausgedrückt, ist die einfache Auswahl keine Lösung, da die Gruppe im Allgemeinen von vielen anderen Tabellen referenziert werden kann, nicht nur von einer.

    
Jan Zyka 29.11.2011, 13:13
quelle

3 Antworten

5

Die Überprüfung vor dem Löschen ist weniger effizient und kann dennoch zu einer Constraint-Verletzung führen, wenn ein Link von einer anderen Transaktion zwischen dem Zeitpunkt der Überprüfung und dem Zeitpunkt des Löschvorgangs hinzugefügt wird.

Auf der anderen Seite erlaubt es dem Benutzer eine spezifischere Fehlermeldung anzuzeigen (wie "die Gruppe wird immer noch von einer FooBar referenziert").

Tu einfach das, was du in deinem speziellen Fall am besten findest. Beachten Sie jedoch, dass im Falle einer Ausnahme die gesamte Transaktion zurückgesetzt werden sollte und die Sitzung geschlossen werden sollte, da eine solche Ausnahme die Sitzung in einem inkonsistenten Zustand belässt. Außerdem ist es nicht das Löschen, sondern das Flush oder das Commit, das die Ausnahme auslöst.

Wenn Sie das jetzt überprüfen möchten, gibt es keine magische Lösung. Sie könnten bidirektionale Verknüpfungen haben, und Sie könnten somit überprüfen, ob group.getUsers() empty ist (obwohl dies alle Benutzer der Gruppe abruft). Oder Sie können dedizierte Abfragen wie select count(user.id) from User user where user.group = :group ausführen, um zu wissen, ob die Gruppe noch referenziert ist. Aber Sie müssen einen von diesen für jede mögliche Bezugnahme auf die Gruppe tun.

    
JB Nizet 29.11.2011, 13:22
quelle
0

Sie können SELECT COUNT für Entität basierend auf der Gruppen-ID ausführen und dann nur versuchen, eine Gruppe zu löschen, wenn der zurückgegebene Wert 0 ist.

Was ist los mit der Umgebung, die Sie mit "try / catch" löschen?

    
Ger 29.11.2011 13:19
quelle
0

Bei Verwendung von JPA sollten Sie normalerweise auch Referenzen in Ihrer Domänenobjektgruppe haben. Bevor Sie also die Gruppe löschen, können Sie überprüfen, ob alle diese Sammlungen leer sind. Beachten Sie jedoch, dass dies vor dem Löschen möglicherweise etwas mehr Zeit in Anspruch nimmt, aber möglicherweise erforderlich ist, um den Benutzer über die aktuell zugeordneten Objekte zu informieren, wenn das Löschen fehlschlägt.

    
crusam 29.11.2011 13:25
quelle

Tags und Links