В чем разница между Spring Data JPA и Spring Data JDBC?

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

Ответ

Spring Data JPA и Spring Data JDBC — это проекты Spring Data для работы с реляционными БД, но на разных уровнях абстракции.

Сравнительная таблица:

Критерий Spring Data JPA Spring Data JDBC
Основа Абстракция над JPA (чаще всего Hibernate). Абстракция над чистым JDBC.
Уровень ORM Полноценный ORM: кэширование, ленивая загрузка, отслеживание изменений (dirty checking). Простой маппинг: данные читаются/записываются "как есть", без отслеживания изменений.
Связи (Relationships) Поддерживает сложные связи (@OneToMany, @ManyToMany) с ленивой загрузкой. Работает с агрегатами (Aggregate Roots) по принципу DDD. Связи должны загружаться явно.
Сложность Выше, больше "магии" и накладных расходов. Ниже, поведение более предсказуемо и прозрачно.
Производительность Может быть ниже из-за overhead ORM, но оптимизируема. Обычно выше за счет прямых SQL-запросов и отсутствия кэшей сессии.

Пример Spring Data JPA:

@Entity
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
    private List<Order> orders;
}

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByName(String name);
}

Пример Spring Data JDBC:

@Table("USERS")
public class User {
    @Id
    private Long id;
    private String name;
    @MappedCollection(idColumn = "USER_ID")
    private Set<OrderRef> orderRefs; // Ссылки на ID заказов
}

public interface UserRepository extends CrudRepository<User, Long> {}

Выбор: Используйте Spring Data JPA для сложных доменных моделей со множеством связей. Выбирайте Spring Data JDBC для простых, высокопроизводительных операций, где важен контроль над SQL и предсказуемость.