Co oznaczają REFRESH i MERGE w odniesieniu do baz danych?

94

Jestem ciekawy i muszę szybko znaleźć tę odpowiedź. Google niewiele pomoże.

Interfejs API Java Persistence ma następujące właściwości, które nakazują platformie kaskadowe wykonywanie operacji na powiązanych jednostkach:

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

Wiem, co oznaczają pierwsze dwa: kiedy utrzymuję obiekt A, który ma B, utrwalam również B, a kiedy usuwam A, usuwam również B.

Ale nie rozumiem, co osiągnęli pozostali dwaj. Wsparcie?

André Chalella
źródło

Odpowiedzi:

80

REFRESH oznacza "ściągnij wszelkie zmiany stanu z bazy danych do mojej reprezentacji". Kaskadowo jest to proste; oznacza to, że wszystkie powiązane encje są odświeżane.

MERGE oznacza coś złożonego, co zbliża się do „zapisz”, ale bardziej przypomina „wypchnij odłączoną jednostkę z powrotem do stanu zarządzanego i zapisz zmiany jej stanu”; kaskadowanie oznacza, że ​​wszystkie skojarzone jednostki są wypychane z powrotem w ten sam sposób, a uchwyt jednostki zarządzanej, z którego wracasz, .merge()ma wszystkie skojarzone z nią jednostki zarządzane.

Link do jednej instancji odpowiednich dokumentów

chaos
źródło
1
Jaka jest wartość domyślna (jeśli nie ustawiliśmy żadnego CascadeType) i co jest najbardziej rozsądne / typowe do ustawienia?
Rosdi Kasim
@Rosdi Kasim: CascadeTypeDomyślnie pusta tablica.
user1438038
@chaos so refresh aktualizuje dzieci, aby pasowały do ​​tego, co jest w bazie danych, gdy rodzic jest aktualizowany / odświeżany. Scalanie zasadniczo nadpisze zaktualizowane pola w elementach podrzędnych w bazie danych, aby odzwierciedlić jednostki podrzędne z elementem nadrzędnym. Więc jeśli zostaną użyte oba, co się stanie? Wyobrażam sobie, że źle to zrozumiałem.
Jordan Mackie
87

Znaczenie adnotacji JPA dla relacji „wiele do wielu” :

  • ALL - wszystkie możliwe operacje kaskadowe wykonywane na encji źródłowej są kaskadowane do celu powiązania.
  • ŁĄCZENIE - jeśli podmiot źródłowy jest scalany, scalanie jest kaskadowane do celu powiązania.
  • UTRZYMAJ - jeśli jednostka źródłowa jest utrwalana, utrwalanie jest kaskadowane do celu powiązania.
  • REFRESH - jeśli jednostka źródłowa jest odświeżana, odświeżanie jest kaskadowane do celu powiązania.
  • USUŃ - jeśli jednostka źródłowa zostanie usunięta, cel powiązania również zostanie usunięty.

Sam widzę je w ten sposób (bardziej czytelne):

  • MERGE - dla istniejących obiektów, aby scalić istniejące dane w tabeli z danymi w moim obiekcie. (synchronizacja z bazą danych)
  • UTRZYMAJ - tworzy nowe rekordy z obiektu w bazie danych.
  • REFRESH - służy do odświeżenia danych w obiekcie. Być może nastąpiła zmiana w bazie danych, którą należy zsynchronizować. (synchronizacja z bazą danych)
  • REMOVE - to dobrze, usuń.
cgp
źródło
1
Javadoc dla adnotacji niczego dla mnie nie wyjaśnił. Dziękuję za odpowiedź!
André Chalella