Как используется связка Spring Data JPA и Hibernate?

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

Ответ

Spring Data JPA и Hibernate используются вместе как высокоуровневая абстракция для доступа к данным и её ORM-реализация соответственно.

Роли в стеке:

  • Spring Data JPA: Предоставляет абстракцию репозитория, автоматически генерирует CRUD-запросы и запросы по имени метода.
  • Hibernate: Реализует спецификацию JPA, отвечает за маппинг объектов на таблицы БД, кэширование, генерацию и выполнение SQL.

Пример реализации:

  1. Сущность (Entity) — аннотации JPA (реализуются Hibernate):

    import javax.persistence.*;
    
    @Entity
    @Table(name = "users")
    public class User {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @Column(nullable = false, unique = true)
        private String email;
    
        private String name;
        // Конструкторы, геттеры, сеттеры
    }
  2. Репозиторий (Repository) — абстракция Spring Data JPA:

    import org.springframework.data.jpa.repository.JpaRepository;
    import java.util.List;
    
    public interface UserRepository extends JpaRepository<User, Long> {
        // Автоматически генерируется запрос: SELECT * FROM users WHERE email = ?
        User findByEmail(String email);
    
        // Более сложный запрос с сортировкой
        List<User> findByNameContainingIgnoreCaseOrderByNameAsc(String namePart);
    
        // Запрос с аннотацией @Query (JPQL или native SQL)
        @Query("SELECT u FROM User u WHERE u.name LIKE %:pattern%")
        List<User> findByNameCustom(@Param("pattern") String pattern);
    }
  3. Использование в сервисе:

    @Service
    @Transactional
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    
        public User createUser(User user) {
            return userRepository.save(user); // Сохранение через Hibernate
        }
    
        public List<User> searchUsers(String name) {
            return userRepository.findByNameContainingIgnoreCaseOrderByNameAsc(name);
        }
    }

Преимущества связки:

  • Сокращение шаблонного кода: Spring Data JPA избавляет от написания базовых CRUD-операций.
  • Декларативные запросы: Запросы генерируются из имён методов или описываются аннотацией @Query.
  • Мощность ORM: Hibernate предоставляет кэширование 1-го и 2-го уровня, ленивую загрузку, наследование сущностей.