CRUD операции в Spring Data JPA и Hibernate

155
30 октября 2019, 16:20

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

Не могу понять этого выражения в сфере сравнения с реализацией JPA (допустим Hibernate). При использовании Spring Data JPA, для использования CRUD операций необходимо наследоваться от интерфейса CrudRepository, но без Hibernate Spring Data JPA самостоятельно работать не может, так как он не умеет трансформировать java объект в сущности. НО! Hibernate может и сам выполнять CRUD операции. Итого, вопросы:

  1. Зачем использовать Spring Data JPA (именно CRUD операции), если нам все равно необходимо задействовать HIBERNATE?
  2. интерфейс CrudRepository – это просто интерфейс, он наследуется от интерфейса Repository. Мы его наследуем для реализации CRUD операций. Не пойму, как он работает. Как может наш класс выполнять CRUD операции просто унаследовав интерфейс. Там же нет реализованных методов.

Как я могу пока ответить на эти вопросы:

  1. Разве что для упрощения кода. Так как для использования CRUD операций через Hibernate необходимо больше кода.
  2. Пока в голову приходят только мысли, что каким-то («магическим») образом интерфейс CrudRepository использует стандартные средства Hibernate для использования CRUD операций.
Answer 1

Давайте разбираться по порядку.

JPA (Java Persistence API) - Спецификация, которая объясняет как записывать, читать и управлять данными, которые представленны в виде Java объектов в реляционных базах данных.

Hibernate - Предоставляет одну из реализаций спецификации JPA, т.е. он умеет переводить Java объекты в записи реляционной таблицы, создавать запросы по записи, чтению и управлению данными.

Spring Data JPA - часть библиотеки Spring, которая предоставляет дополнительный уровень абстракции, чтобы сократить количество одинакового кода, например такого, как работа с EntityManager.

Суммируя написанное выше, подведём, что Hibernate это реализация JPA спецификации, в то время как Spring Data JPA предоставляет ещё один уровень абстракции, над JPA.

  1. Для того, чтобы писать меньше кода, так как репозитории способны сгенерировать код, под необходимый запрос. Отпадает необходимость тащить тот же EntityManager и писать запросы вида:

    public List<Smth> findAll() {
       return session.createQuery("SELECT a FROM Smth a", Smth.class).getResultList();      
    }

    когда в репозитории этот же код выглядит следующим образом:

    public interface SmthRepository extends JpaRepository<Smth, Long> {
      List<Smth> findAll();
    }
  2. Spring генерирует код на основе названия и сигнатуре методов интерфейсе, иногда ему можно помочь сгенерировать правильный запрос с помощью аннотации @Query.

  3. Да, как подметил @Sergey Gornostaev, 1 и 3 вопросы одинаковые.

  4. Как было сказано в ответе 2, генерация происходит по имени и сигнатуре метода.

Answer 2
  1. Ответ в третьем пункте.
  2. Spring создаёт реализацию интерфейса на лету.
  3. Да.
  4. Ответ во втором пункте.

Стандартная матрёшка абстракций

Spring Data
     |
    JPA
     |
    JDBC

Каждый новый уровень скрывает (абстрагирует) детали низлежащего.

READ ALSO
Как передать данные из Json в ArrayList

Как передать данные из Json в ArrayList

Пробую высветлить несколько маркеров на карте но не понимаю как правильно создать запрос к Json помогите пожалуста

160
cannot be applied to given types

cannot be applied to given types

Не знаю в чём ошибка сижу 2ой час

224
Как продолжить цикл из другого метода

Как продолжить цикл из другого метода

Хочу чтобы из места обозначенного комментарием //это место "перекинуло" в цикл обозначенного //этот цикл, при том, что они находятся в разных...

127