Ответ
Spring Data JPA и Hibernate используются вместе как высокоуровневая абстракция для доступа к данным и её ORM-реализация соответственно.
Роли в стеке:
- Spring Data JPA: Предоставляет абстракцию репозитория, автоматически генерирует CRUD-запросы и запросы по имени метода.
- Hibernate: Реализует спецификацию JPA, отвечает за маппинг объектов на таблицы БД, кэширование, генерацию и выполнение SQL.
Пример реализации:
-
Сущность (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; // Конструкторы, геттеры, сеттеры } -
Репозиторий (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); } -
Использование в сервисе:
@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-го уровня, ленивую загрузку, наследование сущностей.