Sobes.tech
Junior

Ce este JPA (Java Persistence API)?

sobes.tech AI

Răspuns de la AI

JPA este o specificație API pentru gestionarea persistenței datelor în aplicațiile Java. Oferă o metodă standard de mapare a obiectelor Java în bazele de date relaționale (sau alte depozite de date) și invers. JPA face parte din platforma Java EE (acum Jakarta EE) și poate fi utilizată și în aplicații standalone.

Componentele cheie ale JPA:

  • Entitate: Clase Java normale (POJO-uri), marcate cu adnotarea @Entity, care reprezintă date în bază de date.
  • EntityManager: Interfață pentru interacțiunea cu contextul de persistență. Este folosit pentru căutarea, crearea, actualizarea și ștergerea entităților.
  • Contextul de persistență: Set de entități gestionate de EntityManager. Aici sunt urmărite modificările entităților înainte de sincronizarea cu baza de date.
  • JPQL (Java Persistence Query Language): Limbaj de interogare orientat pe obiecte, similar cu SQL, dar care operează cu entități și relațiile lor în loc de tabele și coloane.
  • Criteria API: API orientat pe obiecte pentru executarea interogărilor dinamice.
  • persistence.xml: Fișier de configurare care descrie unitățile de persistență (persistence units) și proprietățile acestora (de exemplu, informații despre conexiunea la bază de date, strategii de mapare).

JPA nu este o implementare concretă ORM (Object-Relational Mapping), ci doar definește contracte și API. Există diverși furnizori de JPA care implementează această specificație, cei mai populari fiind:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Exemplu de definire a unei entități:

// Entitate care reprezintă o înregistrare în tabelul `products`
@Entity
// Numele tabelului în bază de date
@Table(name = "products")
public class Product {

    // Cheie primară
    @Id
    // Strategia de generare a cheii primare
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Coloana `name` în tabel
    private String name;

    // Coloana `price` în tabel
    private BigDecimal price;

    // Constructori, getters și setters
    // ...
}

Exemplu de utilizare a EntityManager:

// Obținerea unui EntityManager din EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Începutul unei tranzacții
    em.getTransaction().begin();

    // Crearea unei noi entități
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Salvarea entității în bază
    em.persist(newProduct);

    // Căutarea unei entități după cheia primară
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Produs găsit: " + foundProduct.getName());

    // Executarea unei interogări JPQL
    List<Product> allProducts = em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
    for (Product p : allProducts) {
        System.out.println(p.getName());
    }

    // Confirmarea tranzacției
    em.getTransaction().commit();

} catch (Exception e) {
    // Rularea înapoi a tranzacției în caz de eroare
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // Închiderea EntityManager
    em.close();
    // Închiderea EntityManagerFactory
    emf.close();
}

Scopul principal al JPA este de a simplifica dezvoltarea aplicațiilor care lucrează cu baze de date, prin abstractizarea detaliilor de nivel inferior ale lucrului cu JDBC și SQL, oferind o abordare orientată pe obiecte pentru persistență. Acest lucru crește portabilitatea codului și reduce dependența de o bază de date specifică.