Sobes.tech
Junior

Šta je JPA (Java Persistence API)?

sobes.tech АИ

Одговор од АИ

JPA je specifikacija API-ja za upravljanje trajnošću podataka u Java aplikacijama. Ona pruža standardni način mapiranja Java objekata u relacione baze podataka (ili druga skladišta podataka) i obrnuto. JPA je deo platforme Java EE (sada Jakarta EE) i može se koristiti i u samostalnim aplikacijama.

Ključne komponente JPA:

  • Entity: Obične Java klase (POJO), označene anotacijom @Entity, koje predstavljaju podatke u bazi.
  • EntityManager: Interfejs za interakciju sa kontekstom trajnosti. Koristi se za pretraživanje, kreiranje, ažuriranje i brisanje entiteta.
  • Persistence Context: Skup entiteta koje upravlja EntityManager. Prati promene entiteta pre sinhronizacije sa bazom.
  • JPQL (Java Persistence Query Language): Objektno-orijentisan jezik za upite, sličan SQL-u, ali radi sa entitetima i njihovim odnosima umesto sa tabelama i kolonama.
  • Criteria API: Objektno-orijentisan API za izvršavanje dinamičkih upita.
  • persistence.xml: Konfiguracioni fajl koji opisuje jedinice trajnosti (persistence units) i njihove osobine (npr. informacije o konekciji na bazu, strategije mapiranja).

JPA ne specificira konkretnu implementaciju ORM (Object-Relational Mapping), već definiše ugovore i API-je. Postoje različiti provajderi koji implementiraju ovu specifikaciju, od kojih su najpopularniji:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Primer definisanja entiteta:

// Entitet koji predstavlja zapis u tabeli `products`
@Entity
// Naziv tabele u bazi podataka
@Table(name = "products")
public class Product {

    // Primarni ključ
    @Id
    // Strategija generisanja primarnog ključa
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Kolona `name` u tabeli
    private String name;

    // Kolona `price` u tabeli
    private BigDecimal price;

    // Konstruktor, getteri i setteri
    // ...
}

Primer korišćenja EntityManager:

// Dobijanje EntityManager iz EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Početak transakcije
    em.getTransaction().begin();

    // Kreiranje nove entiteta
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Čuvanje entiteta u bazi
    em.persist(newProduct);

    // Pretraživanje entiteta po primarnom ključu
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Nađen proizvod: " + foundProduct.getName());

    // Izvršavanje JPQL upita
    List<Product> allProducts = em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
    for (Product p : allProducts) {
        System.out.println(p.getName());
    }

    // Potvrđivanje transakcije
    em.getTransaction().commit();

} catch (Exception e) {
    // Vraćanje transakcije u slučaju greške
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // Zatvaranje EntityManager-a
    em.close();
    // Zatvaranje EntityManagerFactory
    emf.close();
}

Glavni cilj JPA je da pojednostavi razvoj aplikacija koje rade sa bazama podataka, abstrakciono prikrivajući niskonivojske detalje rada sa JDBC i SQL, pružajući objektno-orijentisani pristup perzistenciji. To povećava prenosivost koda i smanjuje njegovu zavisnost od konkretne baze podataka.