Wir haben diese Beziehung:Hibernate 5 + JPA 2 Kaskade nicht beitreten löschen über Tisch
public class RuleProviderEntity implements Serializable
{
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OrderColumn(name = RuleEntity.RULE_SEQUENCE)
private List<RuleEntity> rules;
}
Dies allein eine Tabellenspalte mit 2 Schlüsseln und der RULE_SEQUENCE verbinden schafft. Soweit gut und funktioniert für SELECTs.
Jetzt gibt es eine JQL Abfrage
DELETE FROM RuleProviderEntity WHERE ...
Aber dies nicht gelingt, die RuleEntity
Löschen von Zeilen kaskadieren. Es löscht nur die RuleProviderEntity
und lässt die RuleEntity
intakt.
Soll das in JPA 2 funktionieren und es ist ein Hibernate-Bug, oder fehlt mir etwas in der Config?
Ich weiß, ich könnte @JoinTable
hinzufügen, aber es würde nur die Standardeinstellungen überschreiben.
Auch orphanRemoval
scheint hier nicht notwendig.
Vielleicht könnte ich einen Workaround mit @PreRemove
tun, aber nicht sicher, wie.
Ok danke. Ich habe das Massenlöschverfahren bisher nicht verwendet, so dass ich es nie wusste :) Aber ich bin ziemlich überrascht, dass die Spezifikation keine optionale Kaskadierung erfordert. –
Meine Art zu denken geht so: Es könnte eine Entität sein, die den gleichen Satz von 'RuleEntityProvider's wie die Masse 'DELETE' hat. Wenn ich 'em.remove()' darauf anwählte, würde es kaskadieren, und die verschachtelten 'RuleEntity' -Einheiten der 3. Ebene würden ebenfalls entfernt werden. Also warum nicht auch von der DELETE-Anweisung kaskadieren. –
Kann nicht sehen, warum jede Kaskadierung sogar optional sein sollte. Massenlöschung ist da, um Massenoperationen durchzuführen, ohne Daten aus dem Datenspeicher ziehen zu müssen, und da "Kaskadierung" erfordert, dass der JPA-Provider alle gelöschten Objekte durchläuft, Kaskaden ausarbeitet und dann diese löscht, kann dies nicht gemacht werden. –