Co CascadeType.REFRESH
właściwie robi?
Definicja jest taka
Kiedy odświeżamy jednostkę, odświeżają się również wszystkie jednostki przechowywane w tym polu
ale co to oznacza w praktyce? Czy ktoś mógłby mi podać prosty przykład?
Odpowiedzi:
Poszczególne opisy CascadeType mogą być nieco zagmatwane, ale można to łatwo zrozumieć na podstawie ogólnego przypadku.
Dla dowolnej CascadeType
wartości oznacza to, że jeśli operacja X
jest wywoływana na instancji przy użyciu EntityManager
interfejsu, a ta instancja ma odwołania do innych instancji jednostek, a to powiązanie zostało CascadeType.X
zdefiniowane, EntityManager
operacja zostanie również zastosowana do tej skojarzonej jednostki.
Więc EntityManager.refresh()
jest definiowany jako:
Odśwież stan instancji z bazy danych, nadpisując zmiany wprowadzone w jednostce, jeśli takie istnieją.
Więc jeśli jednostka A ma odwołanie do jednostki B, a to odwołanie jest opatrzone adnotacją @CascadeType.REFRESH
i EntityManager.refresh(A)
jest wywoływane, to EntityManager.refresh(B)
jest również wywoływane niejawnie.
Pobieranie przez odświeżanie: obiekty zarządzane można ponownie załadować z bazy danych przy użyciu metody odświeżania:
Zawartość zarządzanego obiektu w pamięci jest odrzucana (w tym ewentualne zmiany) i zastępowana danymi, które są pobierane z bazy danych. Może to być przydatne, aby upewnić się, że aplikacja obsługuje najbardziej aktualną wersję obiektu jednostki, na wypadek gdyby mogła zostać zmieniona przez innego EntityManager od czasu jej pobrania.
Źródło: http://www.objectdb.com/java/jpa/persistence/retrieve