Co je JPA (Java Persistence API)?
sobes.tech AI
Odpověď od AI
JPA je specifikace API pro správu perzistence dat v Java aplikacích. Poskytuje standardní způsob mapování Java objektů na relační databáze (nebo jiná úložiště dat) a naopak. JPA je součástí platformy Java EE (nyní Jakarta EE) a může být také používána v samostatných aplikacích.
Klíčové komponenty JPA:
- Entity: Obvyklé třídy Java (POJO), označené anotací
@Entity, představující data v databázi. - EntityManager: Rozhraní pro interakci s kontextem perzistence. Používá se k vyhledávání, vytváření, aktualizaci a mazání entit.
- Persistence Context: Sada entit spravovaných
EntityManagerem. Sleduje změny entit před jejich synchronizací s databází. - JPQL (Java Persistence Query Language): Objektově orientovaný jazyk dotazů podobný SQL, ale pracující s entitami a jejich vztahy místo tabulek a sloupců.
- Criteria API: Objektově orientované API pro vykonávání dynamických dotazů.
persistence.xml: Konfigurační soubor popisující jednotky perzistence (persistence units) a jejich vlastnosti (například informace o připojení k databázi, strategie mapování).
JPA není konkrétní implementací ORM (Object-Relational Mapping), ale pouze definuje kontrakty a API. Existují různí poskytovatelé implementující tuto specifikaci, z nichž nejpopulárnější jsou:
- Hibernate
- EclipseLink
- Apache OpenJPA
Příklad definice entity:
// Entita reprezentující záznam v tabulce `products`
@Entity
// Název tabulky v databázi
@Table(name = "products")
public class Product {
// Primární klíč
@Id
// Strategie generování primárního klíče
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// Sloupec `name` v tabulce
private String name;
// Sloupec `price` v tabulce
private BigDecimal price;
// Konstruktor, gettery a settery
// ...
}
Příklad použití EntityManager:
// Získání EntityManageru z EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();
try {
// Zahájení transakce
em.getTransaction().begin();
// Vytvoření nové entity
Product newProduct = new Product();
newProduct.setName("Laptop");
newProduct.setPrice(new BigDecimal("1200.00"));
// Uložení entity do databáze
em.persist(newProduct);
// Vyhledání entity podle primárního klíče
Product foundProduct = em.find(Product.class, 1L);
System.out.println("Nalezený produkt: " + foundProduct.getName());
// Vykonání JPQL dotazu
List<Product> allProducts = em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
for (Product p : allProducts) {
System.out.println(p.getName());
}
// Potvrzení transakce
em.getTransaction().commit();
} catch (Exception e) {
// Vrácení transakce v případě chyby
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
e.printStackTrace();
} finally {
// Uzavření EntityManageru
em.close();
// Uzavření EntityManagerFactory
emf.close();
}
Hlavním cílem JPA je zjednodušit vývoj aplikací pracujících s databázemi tím, že abstrakuje nízkoúrovňové detaily práce s JDBC a SQL, a poskytuje objektově orientovaný přístup k perzistenci. To zvyšuje přenositelnost kódu a snižuje jeho závislost na konkrétní databázi.