Spring Data JPA - automatyczny zapis zmian
Ostatnio w pracy zauważyłem pewną cechę w Spring Data JPA, którą chciałbym się z wami podzielić. Okazuje się, że w JPA modyfikowanego obiektu nie trzeba na końcu zmian zapisywać metodą T save(T entity).
Dlaczego tak się dzieje?
W trakcie pracy z JPA działamy na obiektach tak samo jak byśmy działali na encjach. Używając metody T save(T entity) przydzielamy obiekt do obiektów obsługiwanych przez JPA. Wniosek jest taki, że każdy nowy obiekt, który chcemy stworzyć w bazie musimy zakończyć potwierdzeniem tego metodą zapisującą.
Inaczej jest z obiektami, które pobieramy. Pobieramy obiekt jest już obsługiwany, dlatego każda zmiana na tym obiekcie będzie kończyła się zmianą wartości w bazie danych.
A co jeżeli nie chcemy, aby tak się działo?
Są rozwiązania i obejścia tego mechanizmu.
Jednym z rozwiązań jest wykonanie metody detach() z konkretnym obiektem lub clear() na EntityManagerze. Metody te usuwają z kontekstu JPA obiekty i przestają je obsługiwać.
Przeczytałem także o szybkim obejściu tego mechanizmu. Wystarczy, że na interfejsie repozytorium założy się nową tranzakcję. Jeżeli transakcja kończy się od razu po pobraniu danych to nie jest możliwe zapisanie zmian związanych z tym obiektem w innej transakcji.
Jakie są konsekwencje wyłączenia tego mechanizmu?
Jest jeden powód dlaczego warto tego używać. Wykorzystując obiekty niepowiązane (detached), zabijamy mechanizm luźnego pobierania danych (lazy-loading).
Podsumowując
Przedstawiona opcja jest bardzo wygodna, jeżeli się o niej wie. Pamiętać trzeba o tym, że nowe obiekty trzeba ręcznie dodawać do obsługiwanych, a obiekty pobrane są już obsługiwane przez JPA.
Comments
Post a Comment