2017-04-27 2 views
1

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.

Antwort

3

Sie meinen, eine JPQL Bulk Delete-Abfrage wird ausgegeben? anstatt em.remove().

Eine Bulk-Delete-Abfrage wird KEINE Kaskadensemantik respektieren und ist nicht dafür vorgesehen, die verwalteten Objekte im Speicher konsistent mit dem Datenspeicher zu halten. Wenn Sie kaskadieren möchten, müssen Sie em.remove() anrufen. Wenn Sie sich nicht sicher sind, schauen Sie sich die JPA-Spezifikation an.

+0

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

+0

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

+0

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