2011-12-19 13 views
8

ja odziedziczyliśmy bazę kodu, na którym prawie wszystkie relacje mają następujące adnotacje:Kaskada JPA = REMOVE i Hibernate @OnDelete używane razem?

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing") 
@OnDelete(action = OnDeleteAction.CASCADE) 

Teraz mam kłopoty ze zrozumieniem tego, co @OnDelete robi w pierwszej kolejności. Hibernate: OnDelete vs cascade=CascadeType.REMOVE jest interesujący, ale niestety nie ma żadnych odpowiedzi, a JavaDoc dla @OnDelete jest szczególnie bezwartościowy.

Z pozostałych pytań wygląda na to, że adnotacja OnDelete w jakiś sposób pozwala DB na kaskadowanie, podczas gdy dyrektywa kaskadowa na @OneToMany pozwala ORM to zrobić, ale jaki byłby cel ich wykorzystania?

A czy dyrektywa kaskadowa @OneToMany tak naprawdę nie pozwala, aby implementacja ORM generowała kaskadę opartą na DB?

Odpowiedz

8

Powiedzmy, że masz jeden-do-jednego kierunkową relacji

class House { 

    @OneToOne 
    Object door; 

} 

Jeśli używasz CascadeType.REMOVE następnie usunięcie z domu będzie również usunąć drzwi.

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

Jeśli użyjesz @OdDelete, usunięcie drzwi spowoduje również usunięcie domu.

@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

Czytaj więcej tutaj: http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

+2

Zachowanie z '@ OneToOne' i' @ OneToMany' nie wydaje się być zupełnie sama. Z '@OneToMany (...) @OdDelete (action = OnDeleteAction.CASCADE) Object doors', wydaje się, że usunięcie domu powoduje usunięcie wszystkich jego drzwi, ale usunięcie drzwi nie powoduje usunięcia domu. – Bruno

+0

To musiałoby być "@OneToMany List doors', jak sądzę. Ale poza tym to odwzorowanie zwykle nie tworzy kolumny na stole House. Miałbyś odwrotne odwzorowanie na 'Doors.house' lub tabelę zbierania. Jeśli chodzi o kaskadowanie bazy danych, myślę, że kolumna musi znajdować się w tabeli, do której chcesz się kaskadować. –

+0

Nie zgadzam się. Myślę, że największą różnicą między '' 'CascadeType.REMOVE''''' '@ OnDelete''' w widoku użytkownika jest to, że' '@ OnDelete''' może pracować z JPAQL (ponieważ jest oparty na kaskadzie DB)), ale '' CascadeType.REMOVE''' nie może działać z JPAQL. – okwap

Powiązane problemy