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.
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.
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.