Какова связь между Spring Data JPA, JPA и Hibernate?

«Какова связь между Spring Data JPA, JPA и Hibernate?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Это три слоя абстракции для работы с данными в Spring-приложениях:

Уровень Роль Пример
Spring Data JPA Абстракция над JPA Упрощает доступ к данным через репозитории, генерирует запросы.
JPA (Jakarta Persistence) Стандарт ORM (спецификация) Определяет API (EntityManager, @Entity), но не реализацию.
Hibernate Реализация JPA (провайдер) Выполняет ORM-маппинг и генерирует SQL.

Как они взаимодействуют:

  1. Spring Data JPA использует JPA API для операций с данными.
  2. JPA делегирует фактическую работу провайдеру, например, Hibernate.
  3. Hibernate взаимодействует с базой данных через JDBC.

Практический пример:

// 1. JPA Entity (Стандарт)
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
}

// 2. Spring Data JPA Repository (Абстракция)
public interface UserRepository extends JpaRepository<User, Long> {
    // Запрос генерируется автоматически на основе имени метода
    List<User> findByName(String name);
}

// 3. Использование в сервисе
@Service
@Transactional // Spring управляет транзакцией через JPA
public class UserService {
    @Autowired
    private UserRepository repo; // Spring Data JPA

    public User createUser(String name) {
        User user = new User();
        user.setName(name);
        return repo.save(user); // -> JPA -> Hibernate -> SQL INSERT
    }
}

Ключевое преимущество: Spring Data JPA резко сокращает boilerplate-код, автоматизируя создание репозиториев и запросов, в то время как Hibernate остаётся мощным и гибким ORM-движком под капотом.