Ich habe eine Entität A
mit einer Sammlung von Grundtypen (z. B. String
). Ich verwende ein solches Mapping, weil die Strings, die jeder Instanz von A
zugeordnet sind, vom Lebenszyklus von A
abhängen. Wenn ich eine Instanz von A
aus der DB entfernen möchte, möchte ich auch die zugehörige String
s entfernen.
Meine Zuordnung ist wie folgt:
%Vor% Wenn ich eine Instanz von A
anlege und einige Zeichenfolgen hinzufüge, kann ich die Instanz mit Session.save(myInstance)
beibehalten. Sowohl die Instanz von A
als auch die zugehörige String
s werden beibehalten.
Wenn ich jedoch die gleiche Instanz aus dem DB entfernen möchte, indem ich Session.createQuery("delete A a where a.name = ?").setString(0, name).executeUpdate()
verwende, erhalte ich einen Constraint-Fehler für den Fremdschlüssel:
Eine übergeordnete Zeile kann nicht gelöscht oder aktualisiert werden: Eine Fremdschlüsseleinschränkung schlägt fehl
Aber ich würde erwarten, dass die zugehörige String
s automatisch entfernt wird, bevor die A
Instanz entfernt wird, aber es scheint, dass dies nicht der Fall ist. Ich habe auch keine Möglichkeit gefunden, Kaskadenregeln zu spezifizieren.
Stimmt etwas nicht mit meiner Konfiguration?
Danke
BEARBEITEN: Ich habe auch versucht, @Cascade(CascadeType.DELETE)
für das Feld strings
zu verwenden, und es hilft immer noch nicht. Wenn ich mir die Datenbank anschaue, sehe ich keine ON DELETE
-Richtlinie für den betroffenen Fremdschlüssel.
Jemand, der das gleiche Problem hatte, öffnete eine JIRA: Ссылка . Eine Lösung (oder Workaround) muss vorhanden sein, ich kann nicht die einzige Person sein, die @ElementCollection
verwendet.
Ich habe das Problem gelöst. Ich dachte, dass Löschen mit Session.delete () oder mit einer HQL-Abfrage äquivalent war, aber es scheint nicht. Bei Verwendung der HQL-Abfrage werden die abhängigen Objekte nicht automatisch gelöscht, daher erhalte ich einen Fremdschlüssel-Constraint-Fehler. Die Verwendung von Session.delete () löst das Problem. Außerdem scheint Hibernate keine Kaskadenfunktionalität der Datenbank zu verwenden, da ich in der generierten DDL immer noch keine CASCADE-Richtlinie sehe, die intern behandelt.
Ich habe das Problem gelöst.
Ich dachte, dass das Löschen einer Entität mit Session.delete()
oder die Verwendung einer HQL
-Abfrage äquivalent ist, aber es scheint nicht so. Mit HQL
query werden die abhängigen Objekte nicht automatisch gelöscht, daher erhalte ich einen Fremdschlüssel-Constraint-Fehler, wie in der Frage erläutert.
Die Verwendung von Session.delete()
löst das Problem. Außerdem scheint Hibernate keine Kaskadenfunktionalität der Datenbank zu verwenden, da ich in der generierten DDL immer noch keine CASCADE-Richtlinie sehe, die intern behandelt.
Für Moderatoren:
Ich habe meine Antwort auf die Frage in der Vergangenheit hinzugefügt (wie Sie gefragt haben), aber da dies die Antwort ist, die das Problem löst und keine Antwort (von anderen Benutzern) gepostet wurde, sollte ich es hier posten als Antwort.
Fügen Sie "@Cascade" (org.hibernate.annotations.Cascade) hinzu
Beispiel:
%Vor%Tags und Links java hibernate cascading-deletes