Ответ
JPA (Java Persistence API) — это стандартная спецификация, а Hibernate — её самая популярная реализация. Работать можно на любом уровне.
Сравнение подходов:
| Критерий | JPA (Стандарт) | Нативный Hibernate API |
|---|---|---|
| Портативность | Высокая. Код будет работать с любой JPA-реализацией (EclipseLink, OpenJPA). | Низкая. Код привязан к Hibernate. |
| Функциональность | Базовая, стандартизированная. | Расширенная. Предоставляет возможности, отсутствующие в стандарте JPA. |
| Пример кода | EntityManager, @Entity, JPQL. |
Session, Criteria, HQL, собственный кэш. |
Когда что использовать:
- Используйте JPA: Для нового кода, где важна переносимость и долгосрочная поддержка.
- Можно использовать Hibernate API: Когда необходима специфическая функциональность Hibernate, отсутствующая в JPA, и вы уверены, что не будете менять провайдера.
Пример смешанного использования (чаще всего):
// Основная работа через JPA-интерфейс (EntityManager)
@Entity
public class Product { /* JPA-аннотации */ }
@PersistenceContext
private EntityManager em; // Стандартный JPA
// В особых случаях - получение нативной сессии Hibernate
Session session = em.unwrap(Session.class);
// Использование Hibernate-specific features
NaturalIdLoadAccess<Product> naturalIdLoader = session.byNaturalId(Product.class);
Best practice: Пишите основную логику, придерживаясь стандарта JPA, и используйте нативные возможности Hibernate только там, где это критически необходимо.