Sobes.tech
Junior

Какво е JPA (Java Persistence API)?

sobes.tech AI

Отговор от AI

JPA е спецификация на API за управление на персистентността на данни в Java приложения. Тя предоставя стандартен начин за картографиране на Java обекти към релационни бази данни (или други хранилища на данни) и обратно. JPA е част от платформата Java EE (сега Jakarta EE) и може да се използва и в самостоятелни приложения.

Ключовите компоненти на JPA:

  • Entity: Обикновени Java класове (POJO), означени с @Entity, които представляват данни в базата данни.
  • EntityManager: Интерфейс за взаимодействие с контекста на персистентност. Използва се за търсене, създаване, актуализиране и изтриване на ентитети.
  • Persistence Context: Множество от ентитети, управлявани от EntityManager. Следи промените в ентитетите преди синхронизиране с базата данни.
  • JPQL (Java Persistence Query Language): Обектно-ориентиран език за заявки, подобен на SQL, но работещ с ентитети и техните връзки вместо таблици и колони.
  • Criteria API: Обектно-ориентиран API за изпълнение на динамични заявки.
  • persistence.xml: Конфигурационен файл, който описва единици на персистентност (persistence units) и техните свойства (например, информация за връзка с базата данни, стратегии за картографиране).

JPA не е конкретна реализация на ORM (Обектно-Релационно Картиране), а по-скоро определя договори и API. Съществуват различни доставчици, реализиращи тази спецификация, като най-популярните са:

  • Hibernate
  • EclipseLink
  • Apache OpenJPA

Пример за дефиниране на ентитет:

// Ентитет, представляващ запис в таблицата `products`
@Entity
// Името на таблицата в базата данни
@Table(name = "products")
public class Product {

    // Первичен ключ
    @Id
    // Стратегия за генериране на първичния ключ
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    // Колона `name` в таблицата
    private String name;

    // Колона `price` в таблицата
    private BigDecimal price;

    // Конструктори, гетъри и сетъри
    // ...
}

Пример за използване на EntityManager:

// Получаване на EntityManager от EntityManagerFactory
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPersistenceUnit");
EntityManager em = emf.createEntityManager();

try {
    // Започване на транзакция
    em.getTransaction().begin();

    // Създаване на нов ентитет
    Product newProduct = new Product();
    newProduct.setName("Laptop");
    newProduct.setPrice(new BigDecimal("1200.00"));

    // Запазване на ентитета в базата данни
    em.persist(newProduct);

    // Търсене на ентитет по първичен ключ
    Product foundProduct = em.find(Product.class, 1L);
    System.out.println("Намерен продукт: " + foundProduct.getName());

    // Изпълнение на JPQL заявка
    List<Product> allProducts = em.createQuery("SELECT p FROM Product p", Product.class).getResultList();
    for (Product p : allProducts) {
        System.out.println(p.getName());
    }

    // Потвърждаване на транзакцията
    em.getTransaction().commit();

} catch (Exception e) {
    // Отмяна на транзакцията при грешка
    if (em.getTransaction().isActive()) {
        em.getTransaction().rollback();
    }
    e.printStackTrace();
} finally {
    // Затваряне на EntityManager
    em.close();
    // Затваряне на EntityManagerFactory
    emf.close();
}

Основната цел на JPA е да улесни разработката на приложения, работещи с бази данни, чрез абстрахиране на нискоуровневите детайли на работа с JDBC и SQL, предоставяйки обектно-ориентиран подход към персистентността. Това увеличава преносимостта на кода и намалява неговата свързаност с конкретна база данни.