Š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.