2009-09-04 4 views
22

ist hier Quellcode:Was ist der Unterschied zwischen DELETE_ORPHAN und DELETE?

@OneToOne(fetch = FetchType.LAZY) 
@Cascade({SAVE_UPDATE, EVICT, DELETE}) 
@JoinColumn(name = "A_ID", nullable = true) 
private A a; 

@OneToMany 
@Cascade({SAVE_UPDATE, EVICT, DELETE, DELETE_ORPHAN}) 
@JoinColumn(name = "B_ID") 
private List<B> bList; 

Was ist der Unterschied zwischen DELETE_ORPHAN ist und DELETE?

Antwort

54

Cascade DELETE bedeutet, wenn diese Entität gelöscht wird, löschen Sie die zugehörige Entität.

DELETE_ORPHAN bedeutet, wenn eine Entität aus einer verwandten Eins-zu-Viele-Auflistung entfernt wird, wird sie nicht nur von der aktuellen Entität getrennt, sondern auch gelöscht.

Um ein Beispiel zu geben, betrachten Sie zwei Entitäten: Haus und Zimmer.

LÖSCHEN auf der Zimmerliste auf Haus bedeutet, dass, wenn Sie das Haus löschen, löschen Sie dann alle seine Zimmer.

DELETE_ORPHAN in der Raumliste auf Haus bedeutet, wenn Sie ein Zimmer aus dieser Sammlung entfernen, löschen Sie es vollständig. Ohne sie wäre der Raum noch vorhanden, aber nicht an etwas gebunden (daher "Waise").

In UML- und OO-Modellierungsbegriffen ist dies im Wesentlichen der Unterschied zwischen Komposition und Aggregation. Die House-> Room-Beziehung ist ein Beispiel für Komposition. Ein Raum ist Teil eines Hauses und existiert nicht unabhängig davon.

Ein Beispiel der Aggregation ist, sagen wir, Class (Eltern) zu Student (Kind). Löschen Sie die Klasse und der Student existiert noch (zweifellos in anderen Klassen). Das Entfernen des Schülers aus der Klasse bedeutet normalerweise nicht, ihn zu löschen.

+5

FYI: Wenn Ihre Schnittstelle zu Hibernate ** JPA ** ist, können Sie dies mit dem Attribut 'orphanRemoval = true' in der '@ OneToMany' Annotation seit ** JPA 2.0 ** erreichen. Siehe http://stackoverflow.com/a/2928481/1029261 – rmoestl

Verwandte Themen