Entity Manager, czyli coś co obsługuje nasze encje – albo inaczej obiekty – których stanem chcemy zarządzać. Czym jest co coś? I jak się z tym obchodzić…?
Cześć! 🙂
Przedstawię Ci dziś kilka podstaw Entity Managera, które często się ignoruje bo są 'banałem’. Z tego artykułu dowiesz się:
Czym dokładnie jest Entity Manager
EntityManager z punktu technicznego jest po prostu interfejsem. Interfejsem, który definiuje kontrakt zapewniający zarządzanie cyklem życia encji, np. pobranie z bazy, zapisanie czy też usunięcie. Entity Manager jest częścią czegoś co się nazywa JPA – Java Persistence API. Natomiast samo JPA jest tylko (albo aż) specyfikacją opisującą jak aplikacje powinny obchodzić się z zarządzaniem relacyjnymi danymi w aplikacjach.
Dzięki temu, że JPA jest tylko specyfikacją, możemy używać różnych dostawców implementacji JPA (również swojej – co w produkcyjnych wersjach nie jest wskazane). Jeżeli nasz dostawca implementacji w jakiś sposób nam podpadnie, łatwo powinniśmy móc zmienić implementację na innego providera. Niestety, często zdarza się, że nie jest to takie proste. Dostawcy dostarczają nam również 'miłe dodaki’, które niby pomagają naszym projektom ale przy okazji uzależniają nas od konkretnego dostawcy. Jeżeli podchodzimy dojrzale do tego co produkujemy – nie odchodźmy od standardu specyfikacji – chyba, że robimy to świadomie.
Wracając do samego EM (Entity Managera). W dokumentacji znajdziemy
An
EntityManager
instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity instance. Within the persistence context, the entity instances and their lifecycle are managed.
A czym w zasadzie jest ten persistence context? Na stackoverflow można znaleźć odpowiedź na to pytanie. Ja natomiast podsumuję to swoimi słowami i tym jak ja to rozumiem. Dla mnie persistence context jest kontekstem w ramach którego dana encja (lub encje) wykonuje interakcje z bazą. Weźmy taki przykład: chcesz zapisać w bazie nowego użytkownika, który posiada rolę administratora (rola jest zapisywana w tabeli pośredniczącej). Kontekstem w tym przypadku będzie zarówno zapisanie nowego użytkownika, znalezienie roli, oraz przypisanie tej roli dla tego konkretnego użytkownika. Jest to tzw. transaction peristence context.
Entity Manager w świecie EE vs SE
Przykład jaki podałem w poprzednim akapicie dotyczył tzw. transaction scoped kontekstu. Oznacza to, że w ramach jednej transakcji możesz wykonywać różne operacje i każda będzie odzwierciedlała to co się dzieje w bazie. Kontekst transakcji jest używany w świecie Javy EE, gdzie kontener jest odpowiedzialny za entity managera (otwieranie i zamykanie). W wersji EE, można jeszcze użyć drugiego trybu – tzw. Extended persistence scope. Nie będę się rozpisywał na ten temat, jedną z definicji możesz przeczytać tutaj.
Jak to wygląda natomiast w Javie SE? W Javie SE to Ty, developer jesteś odpowiedzialny za zarządzanie EM. Co jest też ważne w Javie SE możesz użyć tylko extended persistence scope, który różni się nieco od tego w Javie EE. Różnica polega na tym, że w świecie enterprise aby użyć extended scope’u musisz posiadać @Stateful beany.
A jak to wygląda w spring boocie? W standardowej wersji, spring boot stoi na Tomcacie, który nie jest kontenerem EE. Korzystając z spring-boot-startera, używamy też Hibernate’a – w rezultacie wygląda na to, że korzystamy z kontekstu extended persistence. A jednak nie musimy manualnie otwierać a później zamykać EM. Ta magia dzieje się gdzieś pod spodem. Jeżeli masz wiedzę na ten temat i chciałbyś się podzielić tym ze społecznością, jak Spring działa w odniesieniu do Entity Manager’a – napisz do mnie na bartoszdabek1@gmail.com (lub linkedin)
Implementacje EM
Teraz, gdy już wiesz, czym jest i do czego służy EntityManager możesz go spokojnie zaimplementować… Nie no żartuję 😀 . Oczywiście, mógłbyś to zrobić, choć nie ukrywajmy, to nie jest proste zadanie. Na przestrzeni lat pojawiło się sporo implementacji, które są na tyle dojrzałe i swoje 'przeżyły’ na niejednej produkcji, że warto na nie zwrócić uwagę.
I oczywiście numerem jeden, moim zdaniem jest Hibernate. Tak naprawdę nigdy nie korzystałem z innej implementacji JPA, więc nawet nie mam porównania do innych dostawców. Mimo wszystko, jak w googlu wpiszesz java jpa, to w grafikach od razu pojawi Ci się Hibernate. I nie bez powodu – Hibernate jest najbardziej popularną i zaawansowaną implementacją – w dodatku bardzo dobrze udokumentowaną.
Są też inni dostawcy, np. Toplink, EclipseLink czy Apache OpenJPA. Ale tak jak mówię, nie korzystałem z innych providerów, nie mam żadnego porównania (no i ten artykuł nie ma na celu porównania poszczególnych implementacji).
Podsumowanie
Najważniejszą rzeczą, o której musisz wiedzieć jest to, że Entity Manager jest tylko i aż interfejsem. Jest on częścią specyfikacji JPA i udostępnia operacje jakie mogą być użyte na encji bazodanowej. Pozwala na zarządzanie encją i działa w ramach kontekstu perzystencji.
Za Tydzień
Pogadamy o tym jak radzić sobie ze stresem w pracy i nie tylko. Albo może bardziej jak ja radzę sobie ze stresem (a ostatnimi czasy jest tego sporo) 🙂
„…persistence context jest kontekstem..”
Na pewno da się to ująć innymi słowami 🙂
tranzakcja -> transkacja
https://sjp.pl/transakcja
Z Hibernate trzeba uważać. Jest to świetne i sprawdzone narzędzie, ale jednocześnie łatwo sprawić, że zapytania do bazy będą bardzo nieoptymalne.