Kaskadierte Löschung der Sammlung einbettbarer Objekte

8

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.

    
Mickael Marrache 29.08.2012, 07:36
quelle

4 Antworten

7

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.

    
Mickael Marrache 15.01.2013, 14:40
quelle
0
  • Wie wäre es mit dem Hinzufügen von orphanRemoval configuration?

  • oder rufen Sie A.strings().clear() manuell auf, bevor Sie eine Instanz löschen?

Wenn beide oben nicht funktionieren, gibt es vielleicht einen Fehler für ElementCollection

    
donnior 29.08.2012 09:16
quelle
0

Test force delete verwaiste:

%Vor%     
Manu Navarro 29.08.2012 09:20
quelle
-1

Fügen Sie "@Cascade" (org.hibernate.annotations.Cascade) hinzu

Beispiel:

%Vor%     
Manu Navarro 29.08.2012 09:03
quelle