Definicja #
JPA (Java Persistence API) to oficjalny standard Javy (część Jakarta EE) definiujący sposób mapowania obiektów Java na relacyjne bazy danych. JPA samo w sobie jest specyfikacją — implementację dostarczają dostawcy ORM, z których najważniejszy to Hibernate.
Kluczowe elementy JPA:
- Adnotacje mapowania —
@Entity,@Table,@Id,@GeneratedValue,@Column,@OneToMany,@ManyToOne,@ManyToMany - EntityManager — centralne API do operacji CRUD: persist, merge, remove, find
- JPQL (Java Persistence Query Language) — obiektowy język zapytań niezależny od dialektu SQL
- Criteria API — type-safe, programowe budowanie zapytań
- Lifecycle callbacks —
@PrePersist,@PostLoaddo logiki przed/po operacjach - Cascade operations — automatyczna propagacja operacji na powiązane encje
- Lazy/Eager loading — kontrola ładowania powiązanych kolekcji
W Spring Boot JPA jest używany przez Spring Data JPA, który dodaje warstwę Repository Pattern i automatycznie generuje zapytania z nazw metod (findByEmailAndActive()).
Zastosowania #
- Mapowanie klas domenowych Java na tabele bazy danych przez adnotacje — eliminacja ręcznego SQL dla operacji CRUD
- Definiowanie relacji między encjami (@OneToMany, @ManyToMany) z obsługą cascade i lazy loading
- Pisanie zapytań JPQL do pobierania złożonych grafów obiektów niezależnie od dialektu SQL
- Integracja z Spring Data JPA do automatycznego generowania repozytoriów i zapytań z nazw metod
- Zarządzanie transakcjami przez @Transactional w aplikacjach Spring Boot i Jakarta EE
Ścieżka nauki #
Naukę JPA najlepiej połączyć z konkretną implementacją — Hibernate lub Spring Data JPA. Oficjalna dokumentacja Hibernate (hibernate.org/documentation) i Spring Data JPA (spring.io/projects/spring-data-jpa) to dobre punkty startowe. Książka "Java Persistence with Spring Data and Hibernate" Christiana Bauera jest kompleksowym zasobem.
Zacznij od podstaw: konfiguracja datasource, adnotacje @Entity/@Id, proste operacje CRUD przez EntityManager lub JpaRepository. Następnie poznaj relacje (@OneToMany z mappedBy, @ManyToMany z @JoinTable), strategie fetchowania i problem N+1 (i jak go rozwiązać przez JOIN FETCH lub EntityGraph).
Na poziomie zaawansowanym: Criteria API, Second Level Cache (Ehcache/Redis), optymistyczna blokada (@Version), audyt encji (@CreatedDate, @ModifiedDate) i migracje schematów przez Flyway/Liquibase. Zrozumienie problemu N+1 i sposobów jego rozwiązania jest kluczowe dla wydajnych aplikacji JPA.