Sobes.tech
Junior

Kas yra JPA (Java Persistence API)?

sobes.tech AI

Atsakymas iš AI

JPA yra API specifikacija duomenų išlaikymo valdymui Java programose. Ji suteikia standartinį būdą Java objektų atvaizdavimui į reliacines duomenų bazes (ar kitas saugyklas) ir atgal. JPA yra Java EE (dabar Jakarta EE) platformos dalis ir taip pat gali būti naudojama kaip nepriklausomos programos.

JPA pagrindiniai komponentai:

  • Entity: Įprasti Java klasės (POJO), pažymėtos @Entity anotacija, atvaizduojančios duomenis bazėje.
  • EntityManager: Sąsaja sąveikai su išlaikymo kontekstu. Naudojama ieškoti, kurti, atnaujinti ir šalinti entitetus.
  • Persistence Context: Entitetų rinkinys, valdoma EntityManager. Jame stebimi entitetų pakeitimai prieš sinchronizuojant su duomenų baze.
  • JPQL (Java Persistence Query Language): Objektų orientuotas užklausų kalba, panaši į SQL, bet veikia su entitetais ir jų ryšiais, o ne su lentelėmis ir stulpeliais.
  • Criteria API: Objektų orientuotas API dinamiškoms užklausoms vykdyti.
  • persistence.xml: Konfigūracijos failas, aprašantis išlaikymo vienetus (persistence units) ir jų savybes (pvz., prisijungimo prie duomenų bazės informaciją, žemėlapių strategiją).

JPA nėra konkreti ORM (Object-Relational Mapping) įgyvendinimas, o tik apibrėžia sutartis ir API. Yra įvairių JPA teikėjų, įgyvendinančių šią specifikaciją, iš kurių populiariausi:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Pavyzdys entiteto apibrėžimo:

// Entitetas, atvaizduojantis įrašą `products` lentelėje
@Entity
// Lentelės pavadinimas duomenų bazėje
@Table(name = "products")
public class Product {

    // Pirminis raktas
    @Id
    // Pirminio rakto generavimo strategija
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Stulpelis `name` lentelėje
    private String name;

    // Stulpelis `price` lentelėje
    private BigDecimal price;

    // Konstruktoriai, getteriai ir setteriai
    // ...
}

EntityManager naudojimo pavyzdys:

// EntityManager gavimas iš EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Transakcijos pradžia
    em.getTransaction().begin();

    // Naujo entiteto kūrimas
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Entiteto išsaugojimas duomenų bazėje
    em.persist(newProduct);

    // Entiteto paieška pagal pirminį raktą
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Rastas produktas: " + foundProduct.getName());

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

    // Transakcijos įvykdymas
    em.getTransaction().commit();

} catch (Exception e) {
    // Klaidos atveju transakcijos atšaukimas
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // EntityManager uždarymas
    em.close();
    // EntityManagerFactory uždarymas
    emf.close();
}

Pagrindinis JPA tikslas - supaprastinti duomenų bazių programų kūrimą, abstrakcionuojant žemo lygio JDBC ir SQL detales, teikiant objektų orientuotą požiūrį į išlaikymą. Tai didina kodo pernešamumą ir mažina priklausomybę nuo konkrečios duomenų bazės.