Sobes.tech
Junior

Mis on JPA (Java Persistence API)?

sobes.tech AI

Vastus AI-lt

JPA on API spetsiifikatsioon andmete püsivuse haldamiseks Java rakendustes. See pakub standardset viisi Java objektide kuvamiseks relatsioonandmebaasides (või muudes salvestuskohtades) ja tagasi. JPA on osa Java EE (nüüd Jakarta EE) platvormist ning seda saab kasutada ka iseseisvates rakendustes.

JPA põhikomponendid:

  • Entity: Tavalised Java klassid (POJO), millele on märgitud @Entity annotatsioon ning mis esindavad andmeid andmebaasis.
  • EntityManager: Liides püsivuskonteksti suhtlemiseks. Seda kasutatakse entiteetide otsimiseks, loomiseks, uuendamiseks ja kustutamiseks.
  • Persistence Context: Entiteetide kogum, mida haldab EntityManager. Selles jälgitakse entiteetide muudatusi enne nende sünkroniseerimist andmebaasiga.
  • JPQL (Java Persistence Query Language): Objektorienteeritud päringukeel, mis sarnaneb SQL-ile, kuid töötab entiteetide ja nende suhetega, mitte tabelite ja veergudega.
  • Criteria API: Objektorienteeritud API dünaamiliste päringute täitmiseks.
  • persistence.xml: Konfiguratsioonifail, mis kirjeldab püsivusüksusi (persistence units) ja nende omadusi (nt ühenduse andmebaasiga, kaardistamisstrateegia).

JPA ei ole konkreetne ORM (Object-Relational Mapping) teostus, vaid määratleb lepingud ja API. On erinevaid JPA pakkujaid, kes seda spetsifikatsiooni rakendavad, ning populaarsemad neist on:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Näide entiteedi määratlusest:

// Entiteet, mis esindab kirjet tabelis `products`
@Entity
// Tabeli nimi andmebaasis
@Table(name = "products")
public class Product {

    // Esimene võti
    @Id
    // Esimese võtme genereerimise strateegia
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Veerg `name` tabelis
    private String name;

    // Veerg `price` tabelis
    private BigDecimal price;

    // Konstruktorrid, getterid ja setterid
    // ...
}

EntityManager kasutamise näide:

// EntityManageri saamine EntityManagerFactory-st
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Transaktsiooni algus
    em.getTransaction().begin();

    // Uue entiteedi loomine
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Entiteedi salvestamine andmebaasi
    em.persist(newProduct);

    // Entiteedi otsimine primaarvõtme järgi
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Leitud toode: " + foundProduct.getName());

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

    // Transaktsiooni kinnitamine
    em.getTransaction().commit();

} catch (Exception e) {
    // Kui tekib viga, tühistatakse transaktsioon
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // EntityManageri sulgemine
    em.close();
    // EntityManagerFactory sulgemine
    emf.close();
}

JPA peamine eesmärk on lihtsustada andmebaasipõhiste rakenduste arendust, abstraktsiooni kaudu JDBC ja SQL madala taseme detailidest, pakkudes objektorienteeritud lähenemist püsivusele. See suurendab koodi ülekantavust ja vähendab selle sõltuvust konkreetsest andmebaasist.