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

Why TDD is bad practice?

How correctly imitate dependencies?

Software development using Angular 5 with Spring Boot