Frage

Unsere Java-Anwendung verfügt über ca. 100 kartiert Klassen in einer Datenbank (SQL Server oder MySQL). Wir verwenden Hibernate als unsere ORM (mit XML-Mapping-Dateien).

Wir FOREIGN KEY Einschränkungen in unserer Datenbank Schema angeben. Die meisten unserer FOREIGN KEY Einschränkungen auch ON DELETE CASCADE angeben.

Wir haben ermöglicht Hibernate 2nd Level Cache vor kurzem gestartet (für populäre Einrichtungen und Sammlungen) einige Performance-Probleme zu mildern.

Performance hat sich verbessert, da wir den zweiten Level-Cache aktiviert. Allerdings haben wir auch begonnen ObjectNotFoundExceptions stoßen.

Es scheint, die ObjectNotFoundExceptions werden auftreten, da die Datenbank löscht Tabellenzeilen unter Ruhezustand. Zum Beispiel, wenn wir einen Parent mit Hibernate löschen, wird das Datenbankschema auf alle ON DELETE CASCADE Einheiten Child. Dies geschieht offenbar ohne Wissen überwintert, so dass es keine Chance bekommt die zweite Level-Cache zu aktualisieren (und entfernen Sie alle gelöscht Child Einheiten).

Wir glauben, dass die Lösung für dieses Problem ON DELETE CASCADE aus unserem Datenbank-Schema zu entfernen ist (aber die FOREIGN KEYs halten). Stattdessen müssen wir Hibernate zu löschen Child Abhängigkeiten mit normalen Lösch SQL konfigurieren, die auch Hibernate Update Cache der zweiten Ebene machen. Einige begrenzten Tests haben gezeigt, dass dieser Ansatz scheint zu funktionieren.

Ich wollte einig Community-Feedback zu diesem Thema erhalten. Gibt es alternative Möglichkeiten (besser?) Lösungen für unser Problem? Wie andere mit dieser Situation umgehen? In der Regel, was sind die Vor- und Nachteile, die berücksichtigt werden sollten, wenn ON DELETE CASCADE in einem Datenbankschema mit Hibernate?

Danke.

War es hilfreich?

Lösung

Wenn Sie immer gehen durch das Programm zu löschen, möchten Sie die Einschränkung aus der Datenbank zu übernehmen und dem Hibernate Objekt sagen, ON DELETE CASCADE Pflege der zugehörigen Jungs zu nehmen.

Auf der anderen Seite, wenn Sie Objekte gehen löschen manchmal in Ihrer Java-Anwendung, und manchmal in der Datenbank-Ebene, werden Sie sich mit seltsamen hängenden Daten beenden. In diesem Fall müssen Sie in einen komplizierteren Ansatz suchen .. Sie nicht klar waren, ob dies der Fall war, so würden hier nicht ins Detail gehen.

Andere Tipps

Wenn Sie ON DELETE CASCADE in Ihrer Datenbank verwenden, müssen Sie Hibernate sagen, wie diese:

@OnDelete(action = OnDeleteAction.CASCADE)

Dies unterscheidet sich von

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)

Diese hibenrate etwas über die In-Memory-Beziehung erzählt. die erste optimiert löschen SQL-Anweisungen auf der Datenbankebene. Hibernate muss wissen, dass die DB Pflege der Lösch- Childs nimmt.

Schauen Sie sich auf dieser Seite für eine gute Erklärung für diesen Mechanismus:

http://eddii.wordpress.com/2006 / 11/16 / hibernate-on-deletecascade-Performance /

und der Kommentar vom Entwickler dieser Funktion:

http: //www.mail-archive. com/hibernate-devel@lists.sourceforge.net/msg03801.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top