Ответ
JPA (Java Persistence API) — это стандартная спецификация ORM для Java, описывающая API для управления реляционными данными в приложениях. Hibernate — самая популярная реализация этой спецификации, которая расширяет её возможности.
Ключевые отличия:
- JPA определяет интерфейсы и аннотации (например,
@Entity,@Id). - Hibernate предоставляет их реализацию, а также дополнительные, не входящие в стандарт, функции.
Пример использования JPA (стандартный код):
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Геттеры и сеттеры
}
Пример использования нативного API Hibernate:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("John");
// Метод save() — это специфичный для Hibernate API
session.save(user);
tx.commit();
session.close();
Практика: Для переносимости кода лучше использовать стандартный JPA. К нативным возможностям Hibernate (критерии, кэширование второго уровня, специальные типы данных) прибегают, когда нужна оптимизация или функционал за пределами спецификации.
Ответ 18+ 🔞
Давайте разберем эту хрень, пока не поздно. Вот сидишь ты, такой весь в себе, пишешь на Java, и тут бац — нужно с базой данных работать. А писать эти бесконечные SQL-запросы вручную — это ж, блядь, чистое самоубийство, терпения ноль ебать. Рука отсохнет, пока всё отмаппируешь.
И тут на сцену выкатывается JPA. Представь себе, это как такая официальная бумажка, инструкция от умных дядек. В ней написано: "Вот так, сука, нужно делать ORM (Object-Relational Mapping), чтобы все друг друга понимали". Описывает она всякие аннотации вроде @Entity или @Id. То есть это просто набор правил, интерфейсов. Сама по себе JPA нихуя не работает, это просто идея, чертёж.
А теперь смотри сюда. Hibernate — это тот самый усатый мужик с гаечным ключом, который пришёл и по этому чертежу собрал реальную, блядь, работающую штуку. Да ещё и с прибамбасами. Он не только всё из JPA делает, но и своё, родное, добавляет. Хочешь — работай по стандарту JPA, а захочешь какую-то хитрую, ебейшую оптимизацию — дергай его нативные фичи.
Смотри, как это выглядит на практике.
Если ты патриот и хочешь писать по стандарту (JPA), то твой код будет примерно таким:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Геттеры и сеттеры
}
Всё чинно, благородно. Любая другая реализация JPA (не Hibernate) это проглотит.
А теперь, если ты решил, что стандарт — для слабаков, и полез в карман Hibernate за чем-то особенным, то можешь делать так:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user = new User();
user.setName("John");
// Метод save() — это специфичный для Hibernate API, в чистом JPA его нет!
session.save(user);
tx.commit();
session.close();
Вот этот session.save() — он уже из нативного, хибернейтовского арсенала. Стандартный JPA-способ — это entityManager.persist().
Так как же жить-то, ёпта?
А жить надо с умом, чувак. Основное правило — используй стандартный JPA API, куда только возможно. Зачем? Да затем, что завтра начальник придёт и скажет: "Хибернейт — говно, переезжаем на EclipseLink". И если ты не натыкал в коде своих session.save(), то ты просто поменяешь провайдера в настройках и поедешь дальше. А если натыкал — ну, извини, будешь всё переписывать, ядрёна вошь.
К нативному Hibernate лезь только тогда, когда без него реально никак. Ну там, хитрое кэширование второго уровня настроить, или специфичные типы данных использовать, или его Criteria API, который мощнее стандартного. Но это уже осознанный выбор, а не потому что "ой, так в инете написали".
Короче, запомни: JPA — это "что делать", а Hibernate — "как делать", да ещё и с дополнениями. Не путай одно с другим, и будет тебе счастье. А то ведь можно так запутаться, что потом и самому не разобраться, чих-пых тебя в сраку.