Was ist die Bedeutung des CascadeType.ALLE für eine @ManyToOne JPA association
Denke ich, dass ich falsch verstanden, die Bedeutung von cascading im Rahmen einer @ManyToOne
Beziehung.
Fall:
public class User {
@OneToMany(fetch = FetchType.EAGER)
protected Set<Address> userAddresses;
}
public class Address {
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
protected User addressOwner;
}
Was ist die Bedeutung des cascade = CascadeType.ALL
? Zum Beispiel, wenn ich löschen Sie eine bestimmte Adresse aus der Datenbank, wie wird sich die Tatsache, dass ich die cascade = CascadeType.ALL
auf meine Daten (die User
, glaube ich)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sinne des
CascadeType.ALL
ist, dass die Persistenz weitergeben (cascade) alleEntityManager
Operationen (PERSIST, REMOVE, REFRESH, MERGE, DETACH
) zu den entsprechenden Entitäten.Scheint es in Ihrem Fall eine schlechte Idee ist, da das entfernen einer
Address
führen würde, zu entfernen, die im ZusammenhangUser
. Als Benutzer können mehrere Adressen, die Adressen würden zu Waisen. Jedoch ist der umgekehrte Fall (Anmerkungen zu denUser
) würde Sinn machen - wenn eine Adresse gehört zu einer single-user-nur, es ist sicher zu propagieren und der Entfernung der Adressen gehören zu einem Benutzer, wenn sich dieser Benutzer ist gelöscht.BTW: Sie können hinzufügen, ein
mappedBy="addressOwner"
- Attribut auf IhreUser
an-signal an den Persistenz-provider, dass die join-Spalte sollte in der ADRESSE-Tabelle.Siehe hier für ein Beispiel aus der OpenJPA docs.
CascadeType.ALL
bedeutet, es zu tun alle Aktionen.Zitat:
Sebastian
Von EJB3.0 Spezifikation:
So, in einer nussschale, Entitäten definierten Beziehungen mit
CascadeType.All
wird sichergestellt, dass alle Ausdauer-events wie weiterhin bestehen, aktualisieren, Zusammenführen und löschen, die auftreten, auf die Eltern, weitergegeben werden, um das Kind. Definieren von anderenCascadeType
Optionen bietet der Entwickler mit einem mehr granularen Ebene der Kontrolle darüber, wie die Entität Verein Griffe Persistenz.Zum Beispiel wenn ich ein Objekt Buchen, die eine Liste der Seiten, und ich eine Seite hinzufügen Objekt innerhalb dieser Liste. Wenn die
@OneToMany
annotation definieren den Zusammenhang zwischen Buch und die Seite als gekennzeichnetCascadeType.All
fortbestehenden das Buch führen würde, die Seite auch persistent auf der Datenbank.Als ich erklärte, in dieser Artikel und in meinem Buch, High-Performance Java Persistence, sollten Sie nie verwenden
CascadeType.ALL
auf@ManyToOne
seit entity-state-übergänge verbreiten sollten von Übergeordneten Entitäten Kind lieben.Den
@ManyToOne
Seite immer das Kind, Verein, da sollte es anzeigen der zugrunde liegenden FK.Daher, bewegen Sie die
CascadeType.ALL
von der@ManyToOne
Verband der@OneToMany
was sollten diemappedBy
- Attribut, da es die meisten effizienten one-to-many-mapping.`
In JPA 2.0, wenn Sie möchten, um eine Adresse zu löschen, wenn Sie entfernt eine Benutzer-Entität, die Sie hinzufügen können
orphanRemoval=true
(stattCascadeType.REMOVE
) auf Ihrer@OneToMany
.Mehr Erklärung zwischen
orphanRemoval=true
undCascadeType.REMOVE
ist hier.Wenn Sie nur wollen, löschen Sie die Adresse dem Benutzer zugewiesen und nicht, um Einfluss auf die User-entity-Klasse, sollten Sie versuchen, so etwas wie, dass:
Diese Weise werden Sie nicht brauchen, um sorgen über die Verwendung von fetch in Anmerkungen. Aber denken Sie daran, wenn Sie den Benutzer löschen löschen Sie auch angeschlossen-Adresse-Benutzer-Objekt.