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

Popular posts from this blog

My mistakes in working with legacy code

Na czym spędzamy najwięcej czasu pisząc kod?

Technologia Blokchain zyskuje coraz większą popularność