Przykład użycia JPA w starej wersji 2.1

W tym artykule zajmiemy się przykładem fragmentu aplikacji korzystającej ze specyfikacji Java Persistence API w wersji 2.1. Jest to więc trochę spojrzenie na JPA sprzed rebrandingu. Obecna wersja 3.2.0 (Jakarta Persistence API) była wydana w maju 2024. Jeśli twoja aplikacja była tworzona w latach 2013-2018, jest duża szansa, że korzystała z JPA 2.1 i może wymagać unowocześniania do nowej wersji. Zmiany mogą obejmować nie tylko rebranding na Jakarta Persistence API, ale także mieć wpływ na sposób, w jaki twój kod jest zarządzany i wykonywany.

Opis biznesowy

Głównym celem projektu jest pokazanie, jak skonfigurować i używać starsze wersje bibliotek do implementacji operacji CRUD (Create, Read, Update, Delete) w aplikacjach opartych na JPA (Java Persistence API). Projekt demonstruje, jak radzić sobie z konfiguracją i zarządzaniem zależnościami w czasach, gdy popularne rozwiązania jak Spring nie były jeszcze powszechnie używane lub dostępne.

Kod projektu jest dostępny w repozytorium na GitHubie pod adresem java-jpa-demos. Jest to fragment większej aplikacji, który dotyczy operacji na bazie danych. Ten projekt jest szczególnie wartościowy dla programistów chcących zrozumieć, jak starsze aplikacje były budowane i konfigurowane, zwłaszcza bez użycia nowszych technologii, takich jak Spring Framework.

Informacje techniczne

W niniejszym przykładzie będziemy rozważać program wykorzystujący następujące biblioteki.

  • MySQL Connector Java, wersja 8.0.26, data wydania 19.07.2021
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.26</version>
</dependency>

MySQL Connector/J w wersji 8.0.26 to sterownik JDBC dla MySQL, który umożliwia aplikacjom Java komunikację z bazą danych MySQL. Poniżej znajdziesz szczegółowe informacje o kompatybilności tej wersji z różnymi technologiami.

Java: MySQL Connector/J 8.0.26 jest kompatybilny z Java 8 i nowszymi wersjami, w tym Java 11 i Java 17. Jest zgodny z JDBC 4.2, co oznacza, że może wykorzystywać zaawansowane funkcje JDBC dostępne w nowszych wersjach Javy, takie jak np. „try-with-resources” oraz lepsze zarządzanie zasobami.

JPA (Java Persistence API): MySQL Connector/J działa z JPA 2.1 i nowszymi. Oznacza to, że może być używany z implementacjami JPA takimi jak EclipseLink czy Hibernate.

Hibernate ORM: MySQL Connector/J 8.0.26 jest kompatybilny z Hibernate 5.4 i nowszymi. Dzięki temu możesz korzystać z najnowszych funkcji oferowanych przez Hibernate, w tym wsparcia dla nowoczesnych typów danych i optymalizacji wydajności.

MySQL Server: MySQL Connector/J 8.0.26 jest kompatybilny z MySQL Server 5.7 i 8.0. Jest to ważne, ponieważ zapewnia wsparcie dla nowoczesnych funkcji i optymalizacji dostępnych w tych wersjach serwera MySQL.

TLS/SSL: Wersja 8.0.26 oferuje wsparcie dla najnowszych protokołów TLS, co zwiększa bezpieczeństwo połączeń z bazą danych.

  • Java Persistence API, Version 2.1, wersja 1.0.2.Final, data wydania 23.01.2018
<dependency>
  <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.1-api</artifactId>
  <version>1.0.2.Final</version>
</dependency>

Biblioteka hibernate-jpa-2.1-api w wersji 1.0.2.Final jest częścią specyfikacji JPA (Java Persistence API) i jest używana jako implementacja standardu JPA 2.1. Poniżej znajdziesz szczegółowe informacje o kompatybilności tej wersji z różnymi technologiami.

Java: Specyfikacja JPA 2.1 jest kompatybilna z wersjami Java SE 6, 7, 8. Wersje późniejsze niż Java 8 mogą również działać, ale należy zwrócić uwagę na kompatybilność całego stosu technologicznego.

Hibernate ORM: Hibernate 4.3.x i nowsze wersje są zgodne ze specyfikacją JPA 2.1. Zaleca się używanie co najmniej Hibernate 5.0 dla lepszej wydajności i wsparcia.

Serwery aplikacyjne: JPA 2.1 jest wspierana przez wiele popularnych serwerów aplikacyjnych, takich jak WildFly 8+, JBoss EAP 6.3+, GlassFish 4+, WebLogic 12c, WebSphere 8.5.5. WildFly 8 i późniejsze wersje mają wbudowaną obsługę JPA 2.1.

Frameworki webowe: Spring 4.x w pełni wspiera JPA 2.1. Użycie Spring Data JPA umożliwia łatwą integrację z Hibernate jako dostawcą JPA. Specyfikacja JPA 2.1 jest częścią Java EE 7.

  • Hibernate Core Relocation, wersja 5.5.7.Final, data wydania 25.08.2021
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.5.7.Final</version>
</dependency>
  • Hibernate EntityManager Relocation, wersja 5.5.7.Final, data wydania 25.08.2021
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>5.5.7.Final</version>
</dependency>

Podsumowanie

W niniejszym artykule pokazaliśmy, że aplikacje wykorzystujące starsze wersje bibliotek JPA nadal mogą działać poprawnie. Jednakże, należy mieć świadomość, że wraz z nowymi wersjami JPA 2.2 i 3.0 zostały wprowadzone nowe funkcje i usprawnienia, które mogą istotnie zwiększyć wydajność i elastyczność aplikacji. Przykładowo, JPA 2.2 wprowadził wsparcie dla nowych typów zapytań (np. derived queries, native queries) oraz usprawnienia w obszarze zarządzania transakcjami. Z kolei wersja 3.0, rozszerzyła możliwości integracji z nowoczesnymi technologiami i narzędziami. Przed przeprowadzeniem aktualizacji z JPA 2.1 należy przeanalizować zmiany wprowadzone w nowych wersjach bibliotek zależności oraz opracować odpowiednie testy integracyjne, aby upewnić się, że aplikacja po migracji będzie działać zgodnie z oczekiwaniami.

Aplikacja internetowa do zarządzania zadaniami

Nauka programowania aplikacji z wykorzystaniem wszystkich możliwości Spring Framework to inwestycja czasochłonna lecz z pewnością dająca wiele satysfakcji i korzyści. Spring jest projektem rozwijanym od ponad dwóch dekad, co przekłada się na jego stabilność i dojrzałość. Spring składa się z wielu mniejszych projektów i modułów, takich jak Spring Boot, Spring Data, Spring Security, Spring Cloud, które umożliwiają tworzenie takiej architektury rozwiązania, jaka jest wymagana do spełnienia wymagań klienta i potrzeb użytkownika.

Aby lepiej poznać założenia narzędzia Spring Framework oraz zależności z innymi technologiami, polecam następujący kurs na platformie Udemy:

W tym kursie krok po kroku wykładowca przedstawia w elementarnych przykładach różne zagadnienia związane z technologią Spring Framework, projektem Spring Boot, korzystaniem z bazy danych. Dopiero w siódmym rozdziale od lekcji 86 do 139, mając opanowane podstawy, będzie można śledzić i wypróbować samodzielnie, jak zrealizować prostą aplikację internetową do zarządzania zadaniami.

Poniżej przedstawiam nieco zmodyfikowaną wersję tej aplikacji, która może być wykorzystywana np. przez uczniów do zarządzania swoimi szkolnymi obowiązkami i wydarzeniami. Jest wiele rzeczy, które są w obecnej wersji niedoskonałe i będą przeze mnie rozwijane, dlatego celowo nie chcę wskazywać lokalizacji repozytorium, z którego można pobrać gotowy kod.

Jedno z okien prostej aplikacji webowej do zarządzania listą zadań
Jedno z okien prostej aplikacji webowej do zarządzania listą zadań.

Programowanie przy użyciu ziaren w języku Java

W podręcznikach do nauki programowania w Javie, terminem ziarna (lub ziarnka1) określa się klasę, która ma metody nazywane według ustalonego wzorca.

Dla przykładu, jeśli chcemy zbudować system do obsługi uczniów w szkole, na pewno jednym z obiektów w takim systemie będzie uczeń, który ma pewne cechy własne jak imię i nazwisko, jak też możemy przypisać go do określonej klasy. Znamy również jego ocenę średnią na koniec półrocza. W szkole uczy się wielu uczniów, dlatego obiekt ucznia tworzony będzie według szablonu, czyli klasy.

Aby utworzyć klasę ziarna, oprócz prywatnych pól przechowujących dane, należy zdefiniować metody dostępowe (gettery) oraz metody ustawiające (settery). Klasa ziarna powinna zawierać również domyślny konstruktor, czyli konstruktor bezparametrowy.

Przykładowy kod realizujący powyższe wymagania może mieć następującą postać.

package szkola;

public class Uczen {

	private double srednia;
	private String imie;
	private String nazwisko;
	private String klasa;

	public Uczen() {
	}

	public double getSrednia() {
		return srednia;
	}

	public void setSrednia(double srednia) {
		this.srednia = srednia;
	}

	public String getImie() {
		return imie;
	}

	public void setImie(String imie) {
		this.imie = imie;
	}

	public String getNazwisko() {
		return nazwisko;
	}

	public void setNazwisko(String nazwisko) {
		this.nazwisko = nazwisko;
	}

	public String getKlasa() {
		return klasa;
	}

	public void setKlasa(String klasa) {
		this.klasa = klasa;
	}

}

Możemy spotkać się w większych systemach z konwencją nazewniczą, w której dodaje się słowo Bean w nazwie klasy. Inną często wymaganą cechą obiektów czy komponentów, programistycznych jest możliwość zapisywania ich stanu na dysku oraz przesyłanie w postaci strumienia bajtów przez sieć. Do tego celu służy serializacja.

W naszym przykładzie zostawimy nazwę klasy ziarna tak jak jest, zostając również przy stosowaniu polsko brzmiących nazw pól klasy oraz metod. Zauważmy, że zarówno metody dostępowe jak i ustawiające stosują swój wzorzec nazewniczy polegający na dodaniu odpowiednio przedrostka get dla metody odczytującej wartość pola i przedrostka set dla metody ustawiającej wartość pola.

  1. Horstmann, Cornell, Java Techniki zaawansowane; wyd. IX. Prentice Hall (2013), Helion (2014), tłumaczenie Jaromir Senczyk. ↩︎

Instalacja Javy w systemie Windows

Jeśli chcesz tworzyć programy Java w systemie Windows, należy zwrócić uwagę, czy masz zainstalowany odpowiedni zestaw narzędzi. Aby szybko przejść przez proces przygotowania warsztatu, proponujemy sprawdzoną sekwencję kroków.

W przeglądarce internetowej w polu wyszukiwania wprowadzamy słowa java jdk download.

Z dużym prawdopodobieństwem pierwszym wynikiem na stronie wyników wyszukiwania będzie strona prowadząca do portalu firmy Oracle. Po kliknięciu w link przejdziemy na stronę Java Downloads – Oracle, na której wskazywana będzie najbardziej aktualna wersja wydania platformy Java SE. Obecnie jest to wersja JDK 21. Należy zwrócić uwagę, że na stronie Oracle JDK został udostępniony przycisk umożliwiający przejście do projektu OpenJDK.

W zależności od systemu operacyjnego oraz architektury komputera, na której przygotowywać będziemy programy Javy, wybieramy odpowiedni link do pobrania biblioteki JDK.

Po zainstalowaniu biblioteki Java JDK warto obejrzeć zawartość katalogu, w którym znajdziemy poszczególne komponenty platformy programistycznej Javy. W szczególności interesują nas programy wykonywalne, które odnajdziemy w katalogu bin. Aby mieć do nich dostęp z poziomu konsoli systemowej, należy ustawić ścieżkę w zmiennych środowiskowych systemu. Po ustawieniu odpowiednich wartości w zmiennych JAVA_HOME oraz PATH, można w nowym oknie Wiersza polecenia zweryfikować poprawność wykonania tego kroku sprawdzając np. wersję programu java.exe oraz jshell.exe.

Po poprawnym zainstalowaniu środowiska Java JDK, można spróbować napisać, skompilować i uruchomić prosty program Javy, wykorzystując do tego zwykły notatnik. W przypadku bardziej złożonych projektów będzie jednak niezbędna obecność zintegrowanego środowiska programistycznego IDE.