Java. Менторинг за чашкой кода
Spring Data — это не только JPA
Когда слышишь Spring Data, то первая мысль обычно:
«А, ну это Spring Data JPA».
Но JPA — только один из проектов семейства Spring Data. Давайте разберёмся, что вообще туда входит.
🔹 Spring Data JPA
Самый распространённый вариант для реляционных БД.
Работаем с PostgreSQL, MySQL и другими SQL-БД через JPA.
public interface UserRepository
extends JpaRepository<User, Long> {
}
Под капотом обычно используется Hibernate.
🔹 Spring Data JDBC
Тоже работает с реляционными БД, но подход гораздо проще.
Здесь нет полноценного ORM со всей магией Hibernate:
- нет persistence context в стиле JPA;
- нет lazy loading как в JPA;
- нет dirty checking;
- меньше скрытого поведения.
Получаем более прямолинейную работу с SQL и сущностями.
public interface UserRepository
extends CrudRepository<User, Long> {
}
Хороший вариант, когда возможности полноценного ORM просто не нужны.
🔹 Spring Data R2DBC
А вот здесь уже интереснее, так как R2DBC предназначен для реактивной работы с реляционными БД.
Например:
WebFlux
↓
R2DBC
↓
PostgreSQL
В отличие от классического JDBC, модель рассчитана на неблокирующее взаимодействие. Используется там, где всё приложение действительно построено вокруг reactive stack.
Просто заменить JDBC на R2DBC ради «ускорения» приложения — не хорошая идея.
Также Spring Data работает и с NoSQL:
🔹 Spring Data MongoDB — MongoDB
🔹 Spring Data Redis — Redis
🔹 Spring Data Elasticsearch — Elasticsearch
🔹 Spring Data Cassandra — Cassandra
🔹 Spring Data Neo4j — графовая БД Neo4j
И это далеко не весь список, но самое важное — не выучить все названия, а нужно понимать, какой уровень абстракции вы выбираете.
Например:
Spring Data
│
┌─────────────┴─────────────┐
↓ ↓
Реляционные БД NoSQL
│ │
┌────┼────┐ ┌──────┼──────┐
↓ ↓ ↓ ↓ ↓ ↓
JPA JDBC R2DBC MongoDB Redis Cassandra
JPA — мощная объектно-реляционная модель.
JDBC — более простой и прямолинейный подход к реляционной БД.
R2DBC — реактивный неблокирующий доступ к реляционным БД.
MongoDB / Redis / Cassandra и т.д. — уже другие типы хранилищ и соответствующие модели работы с ними.
И тут часто возникает путаница: JPA ≠ Hibernate ≠ Spring Data JPA
JPA — спецификация.
Она описывает, как должна работать ORM-модель в Java.
Hibernate — реализация JPA.
То есть конкретный ORM, который реализует эту спецификацию.
Spring Data JPA — абстракция Spring поверх JPA, которая сильно упрощает работу с репозиториями.
Условно:
Ваш код
↓
Spring Data JPA
↓
JPA
↓
Hibernate
↓
JDBC
↓
PostgreSQL
Поэтому фраза:
«Мы используем Spring Data»ещё почти ничего не говорит о том, как именно приложение работает с данными. Нужно уточнить:
Spring Data JPA, JDBC, R2DBC, MongoDB, Redis...?И вот это уже хороший вопрос: «Почему в вашем проекте выбран именно Spring Data JPA, а не JDBC?»
Тут уже придётся объяснять не аннотации, а компромиссы выбранного подхода.