Sobes.tech
Junior

Kas ir JPA (Java Persistence API)?

sobes.tech AI

Atbilde no AI

JPA ir API specifikācija datu saglabāšanai Java lietojumprogrammās. Tā nodrošina standarta veidu, kā attēlot Java objektus relāciju datu bāzēs (vai citās glabātuves vietās) un atpakaļ. JPA ir Java EE (tagad Jakarta EE) platformas daļa un to var izmantot arī kā neatkarīgu lietojumprogrammu.

JPA galvenie komponenti:

  • Entity: Parastas Java klases (POJO), kuras ir atzīmētas ar @Entity anotāciju un pārstāv datus datu bāzē.
  • EntityManager: Saskarne ar pastāvības kontekstu. To izmanto entītiju meklēšanai, izveidei, atjaunošanai un dzēšanai.
  • Persistence Context: Entītiju kopums, ko pārvalda EntityManager. Tajā tiek uzraudzītas entītiju izmaiņas pirms sinhronizācijas ar datu bāzi.
  • JPQL (Java Persistence Query Language): Objektorientēta vaicājumu valoda, kas līdzīga SQL, bet darbojas ar entītijiem un to saitēm, nevis ar tabulām un kolonnām.
  • Criteria API: Objektorientēts API dinamisku vaicājumu izpildei.
  • persistence.xml: Konfigurācijas fails, kas apraksta pastāvības vienības (persistence units) un to īpašības (piemēram, savienojuma ar datu bāzi informācija, kartēšanas stratēģija).

JPA nav konkrēta ORM (Object-Relational Mapping) realizācija, bet tikai nosacījumu un API definīcija. Pastāv dažādi JPA nodrošinātāji, kas īsteno šo specifikāciju, no kuriem populārākie ir:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Entītijas definēšanas piemērs:

// Entītija, kas pārstāv ierakstu tabulā `products`
@Entity
// Tabulas nosaukums datu bāzē
@Table(name = "products")
public class Product {

    // Primārais atslēgas lauks
    @Id
    // Primārās atslēgas ģenerēšanas stratēģija
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Kolonna `name` tabulā
    private String name;

    // Kolonna `price` tabulā
    private BigDecimal price;

    // Konstruktori, getteri un setteri
    // ...
}

EntityManager izmantošanas piemērs:

// EntityManager iegūšana no EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Transakcijas sākums
    em.getTransaction().begin();

    // Jauna entītija izveide
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Entītijas saglabāšana datu bāzē
    em.persist(newProduct);

    // Entītijas meklēšana pēc primārā atslēgas
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Meklētais produkts: " + foundProduct.getName());

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

    // Transakcijas apstiprināšana
    em.getTransaction().commit();

} catch (Exception e) {
    // Ja ir kļūda, transakcija tiek atcelta
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // EntityManager aizvēršana
    em.close();
    // EntityManagerFactory aizvēršana
    emf.close();
}

Galvenais mērķis ar JPA ir vienkāršot datu bāzu lietojumprogrammu izstrādi, abstraktiem zemā līmeņa JDBC un SQL detaļām, nodrošinot objektorientētu pieeju pastāvībai. Tas uzlabo koda pārnesamību un samazina atkarību no konkrētas datu bāzes.