Какво е 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, предоставяйки обектно-ориентиран подход към персистентността. Това увеличава преносимостта на кода и намалява неговата свързаност с конкретна база данни.