Sobes.tech
Junior

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.