Ich glaube, ich habe die Bedeutung von Kaskadierung im Kontext einer @ManyToOne
Beziehung falsch verstanden .
Der 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 bedeutet das cascade = CascadeType.ALL
? Wenn ich beispielsweise eine bestimmte Adresse aus der Datenbank lösche, wie wirkt sich die Tatsache, dass ich die hinzugefügt habe, cascade = CascadeType.ALL
auf meine Daten aus (die User
, denke ich)?
quelle
Hier finden Sie ein Beispiel aus den OpenJPA-Dokumenten.
CascadeType.ALL
bedeutet, dass alle Aktionen ausgeführt werden.Zitat:
Sebastian
quelle
Wie ich in erklärte diesen Artikel und in meinem Buch, High Performance Java Persistence , sollten Sie nicht verwenden ,
CascadeType.ALL
auf ,@ManyToOne
da Unternehmen Zustandsübergänge sollten propagieren von übergeordneten Einheiten zu Kindern diejenigen, nicht umgekehrt.Die
@ManyToOne
Seite ist immer die untergeordnete Zuordnung, da sie die zugrunde liegende Fremdschlüsselspalte abbildet.Daher sollten Sie das Attribut
CascadeType.ALL
von der@ManyToOne
Zuordnung zur@OneToMany
Seite verschieben, die auch dasmappedBy
Attribut verwenden sollte, da es die effizienteste Zuordnung von Eins-zu-Viele-Tabellenbeziehungen ist .quelle
Aus der EJB3.0-Spezifikation :
Kurz gesagt, Entitätsbeziehungen, mit denen definiert wurde
CascadeType.All
, stellen sicher, dass alle Persistenzereignisse wie Persistent, Aktualisieren, Zusammenführen und Entfernen, die auf dem übergeordneten Element auftreten, an das untergeordnete Element übergeben werden. Durch das Definieren andererCascadeType
Optionen erhält der Entwickler eine detailliertere Kontrolle darüber, wie die Entitätszuordnung mit der Persistenz umgeht.Zum Beispiel, wenn ich ein Objektbuch hatte, das eine Liste von Seiten enthielt, und ich ein Seitenobjekt zu dieser Liste hinzufüge. Wenn die
@OneToMany
Anmerkung, die die Zuordnung zwischen Buch und Seite definiert, als markiert istCascadeType.All
, würde das Beibehalten des Buches dazu führen, dass die Seite auch für die Datenbank beibehalten wird.quelle
Wenn Sie in JPA 2.0 eine Adresse löschen möchten, wenn Sie sie aus einer Benutzerentität entfernt haben, können Sie sie zu Ihrer Adresse hinzufügen
orphanRemoval=true
(anstelle vonCascadeType.REMOVE
)@OneToMany
.Weitere Erklärung zwischen
orphanRemoval=true
undCascadeType.REMOVE
ist hier .quelle
Wenn Sie nur die dem Benutzer zugewiesene Adresse löschen und die Entitätsklasse des Benutzers nicht beeinflussen möchten, sollten Sie Folgendes versuchen:
Auf diese Weise müssen Sie sich keine Gedanken über die Verwendung von Fetch in Anmerkungen machen. Denken Sie jedoch daran, dass Sie beim Löschen des Benutzers auch die mit dem Benutzerobjekt verbundene Adresse löschen.
quelle