JPA, Hibernate и JDBC: соответствие интерфейсов
Сравнение полезно как карта слоёв, но пары не являются полными аналогами.
| Задача | JPA | Hibernate API | JDBC |
|---|---|---|---|
| фабрика ресурсов | EntityManagerFactory | SessionFactory | DataSource |
| единица работы | EntityManager | Session | Connection |
| граница транзакции | EntityTransaction | Transaction | Connection.commit/rollback |
| объектный запрос | Query, TypedQuery | Query | — |
| SQL-запрос | native query | native query | PreparedStatement |
| чтение результата | сущности, DTO, scalar | сущности, DTO, scalar | ResultSet |
EntityManager обычно оборачивает Hibernate Session, а Session использует JDBC Connection. Получать внутренний объект можно через unwrap, но такой код сильнее связан с провайдером.
Главное отличие единицы работы
Connection знает о SQL и транзакции, но не следит за Java-объектами. EntityManager дополнительно содержит Persistence Context: одну сущность на сочетание типа и идентификатора, снимки для dirty checking и очередь изменений.
entityManager.unwrap(org.hibernate.Session.class)
.doWork(connection -> {
// точечная операция JDBC в той же транзакции
});Прямой JDBC внутри ORM-транзакции требует учитывать порядок flush: данные в объектах могут ещё не попасть в таблицу.
Вопросы для повторения
EntityManagerFactoryсоздают на каждый запрос? Нет, это тяжёлый потокобезопасный объект приложения.EntityManagerпотокобезопасен? Нет, его область обычно совпадает с одной транзакцией или запросом.DataSourceравенEntityManagerFactory? Нет: первый выдаёт соединения, второй создаёт контексты ORM и хранит метаданные.- Зачем нужен
unwrap? Для точечной возможности конкретного провайдера; это осознанный выход за стандарт JPA.
Связано: JPA Hibernate ORM, EntityManager, JDBC.