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


209

Каковы основные различия между Hibernate и Spring Data JPA? Когда не следует использовать Hibernate или Spring Data JPA? Кроме того, когда шаблон Spring JDBC может работать лучше, чем JPA Hibernate / Spring Data?


7
@NeilStockton, спрашивающий о сравнении двух технологий, не спрашивает мнения.
Филипп Рего

Ответы:


263

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

Spring Data предлагает решение для шаблона DDDRepository или устаревших GenericDaoпользовательских реализаций. Он также может генерировать JPA-запросы от вашего имени с помощью соглашений имен методов.

В Spring Data вы можете использовать Hibernate, Eclipse Link или любого другого поставщика JPA. Очень интересным преимуществом использования Spring или Java EE является то, что вы можете декларативно управлять границами транзакции с помощью @Transactionalаннотации .

Spring JDBC намного легче и предназначен для собственных запросов, и если вы собираетесь использовать только JDBC, то лучше использовать Spring JDBC для обработки многословности JDBC.

Поэтому Hibernate и Spring Data дополняют друг друга, а не являются конкурентами.


53
Значит ли это, что Spring Data JPA не может существовать сам по себе? То есть под капотом используется один из поставщиков JPA (например, Hibernate, Eclipselink или любой другой поставщик JPA)?
CuriousMind

Я имею в виду, что если я использую только режим гибернации, для уровня гибернации будет мало настроек. Если я использую Spring data jpa, это выглядит намного проще, чем в режиме гибернации. В этом смысле я задал вам этот вопрос.
Асиф Муштак

1
Точнее, пока все работает нормально, вам нужно только понять верхний уровень, то есть Spring Data JPA. За первым исключением вы, возможно, должны знать более низкие уровни, то есть Hibernate, JDBC и базу данных.
бомбардировщик Marmite

139

Здесь мы используем 3 разные вещи:

  1. JPA: API персистентности Java, который обеспечивает спецификацию для сохранения, чтения, управления данными из вашего Java-объекта и отношений в базе данных.
  2. Hibernate: Существуют различные провайдеры, которые реализуют jpa. Hibernate является одним из них. Так что у нас есть и другой провайдер. Но если использовать jpa с пружиной, это позволит вам в будущем переключаться на других провайдеров.
  3. Spring Data JPA: это еще один слой поверх jpa, который предоставляет Spring для облегчения вашей жизни.

Так позволяет понять , как JPA весной данных и весной + спящий режим работы-


Spring Data JPA:

Допустим, вы используете Spring + Hibernate для вашего приложения. Теперь вам нужно иметь дао-интерфейс и реализацию, где вы будете писать операции crud, используя SessionFactory из hibernate. Допустим, вы пишете класс dao для класса Employee, завтра в вашем приложении может потребоваться написать аналогичную операцию crud для любой другой сущности. Таким образом, есть много шаблонного кода, который мы можем увидеть здесь.

Теперь данные Spring jpa позволяют нам определять интерфейсы dao, расширяя его репозитории (crudrepository, jparepository), чтобы обеспечить реализацию dao во время выполнения. Вам больше не нужно писать реализацию dao. Вот как Spring data jpa облегчает вашу жизнь.


3
Итак, что является базовой реализацией Spring Data JPA, это спящий режим, потому что когда я использую PagingAndSortingRepository, он показывает журналы Hibernate в консоли.
Вики

2
Spring Data JPA по умолчанию использовал реализацию Hibernate. Если вы видите транзитивные зависимости spring-boot-starter-data-jpa, вы можете увидеть там ядро ​​hibernate
IamVickyAV

28

Я не согласен, SpringJPA облегчает жизнь. Да, он предоставляет некоторые классы, и вы можете быстро создать простой DAO, но на самом деле это все, что вы можете сделать. Если вы хотите сделать что-то большее, чем findById () или сохранить, вы должны пройти через ад:

  • нет доступа к EntityManager в классах org.springframework.data.repository (это базовый класс JPA!)
  • собственное управление транзакциями (спящие транзакции запрещены)
  • огромные проблемы с более чем одной конфигурацией источников данных
  • нет пула источников данных (HikariCP должен использоваться как сторонняя библиотека)

Почему собственное управление транзакциями является недостатком? Поскольку Java 1.8 допускает методы по умолчанию в интерфейсах, транзакции, основанные на аннотациях Spring, simple не работают.

К сожалению, SpringJPA основан на отражениях, и иногда вам нужно указывать имя метода или пакет сущностей в аннотациях (!). Вот почему любой рефакторинг приводит к большим сбоям. К сожалению, @Transactional работает только для первичных DS :( Так что, если у вас более одного источника данных, помните - транзакции работают только для первичного источника :)

Каковы основные различия между Hibernate и Spring Data JPA?

Hibernate является JPA-совместимым, SpringJPA Spring-совместимым. Ваш HibernateJPA DAO может использоваться с JavaEE или Hibernate Standalone, когда SpringJPA может использоваться в Spring - SpringBoot, например

Когда не следует использовать Hibernate или Spring Data JPA? Кроме того, когда шаблон Spring JDBC может работать лучше, чем JPA Hibernate / Spring Data?

Используйте Spring JDBC только тогда, когда вам нужно использовать много объединений или когда вам нужно использовать Spring с несколькими подключениями к источникам данных. Как правило, избегайте JPA для Joins.

Но мой общий совет, используйте свежее решение - Daobab ( http://www.daobab.io ). Daobab - это мой Java и любой интегратор движка JPA, и я верю, что он очень поможет в ваших задачах :)


2
Даобаб, правда? Если вам не нравится безопасность типов в jpql (мне не нравится), у JPA есть API критериев безопасности типов ... Стандартный JPA лучше этой плохой альтернативы.
ymajoros

8

Spring Dataэто удобная библиотека, JPAкоторая абстрагируется от многих вещей и приносит волшебство Spring (нравится это или нет) в доступ к хранилищу сохраняемости. Он в основном используется для работы с реляционными базами данных. Короче говоря, он позволяет вам объявлять интерфейсы с такими методами, findByNameOrderByAge(String name);которые будут анализироваться во время выполнения и преобразовываться в соответствующие JPAзапросы.

Его размещение на вершине JPAделает его использование заманчивым для:

  1. Разработчики новичков, которые не знают SQLили знают это плохо. Это рецепт катастрофы, но они могут сойти с него, если проект тривиален.

  2. Опытные инженеры, которые знают, что они делают, и хотят быстро их освоить. Это может быть жизнеспособной стратегией (но читайте дальше).

По моему опыту Spring Data, его волшебство слишком много (это применимо к Springв целом). Я начал интенсивно использовать его в одном проекте и в итоге столкнулся с несколькими угловыми случаями, когда я не мог убрать библиотеку со своего пути, и в итоге я нашел уродливые обходные пути. Позже я прочитал жалобы других пользователей и понял, что эти проблемы типичны для Spring Data. Например, проверьте эту проблему, которая привела к часам расследования / ругательства:

 public TourAccommodationRate createTourAccommodationRate(
        @RequestBody TourAccommodationRate tourAccommodationRate
    ) {
        if (tourAccommodationRate.getId() != null) {
            throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
        }

        // This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
        // when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
        // information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
        // code creating the corresponding slim model. By detaching the entity from the persistence context we
        // force the ORM to re-fetch it from the database instead of taking it from the cache

        tourAccommodationRateRepository.save(tourAccommodationRate);
        entityManager.detach(tourAccommodationRate);
        return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
    }

Я закончил тем, что спустился на более низкий уровень и начал использовать JDBI- красивую библиотеку с достаточным количеством «магии», чтобы спасти вас от шаблона. Благодаря этому вы получаете полный контроль над SQL-запросами, и вам почти никогда не придется бороться с библиотекой.


это хороший ответ, но если бы вы могли перечислить угловые случаи и уточнить их подробнее, это будет очень полезно. Это станет Великим Ответом. Спасибо
Джон

Ну, это не так легко вспомнить, учитывая, что я долгое время не работал с Spring Data - мне придется просмотреть старый код и добавить еще комментарии. Тем не менее, одна из неприятностей прямо из моей головы - в JPA очень часто объекты должны ссылаться друг на друга (например, для каскадных операций). Это приводит к ошибке переполнения стека (из-за циклических ссылок), когда Spring пытается их сериализовать, что вынуждает вас искать уродливые обходные пути. Эта проблема имеет отношение к Spring Data, потому что это проблема JPA. Однако, поскольку JPA лежит в основе Spring Data, вы получаете его «бесплатно».
Райкс

Отредактировал пост и добавил еще один пример.
Райкс

1

Hibernate - это реализация "JPA", которая является спецификацией для объектов Java в базе данных.

Я бы порекомендовал использовать в JPA, поскольку вы можете переключаться между различными ORMS.

Когда вы используете JDBC, вам нужно использовать SQL-запросы, поэтому, если вы разбираетесь в SQL, тогда переходите на JDBC.


1

Если вы предпочитаете простоту и больший контроль над SQL-запросами, я бы предложил использовать Spring Data / Spring JDBC.

Его хороший объем обучения в JPA и иногда трудно отладить проблемы. С другой стороны, хотя у вас есть полный контроль над SQL, становится намного проще оптимизировать запросы и повысить производительность. Вы можете легко поделиться своим SQL с администратором базы данных или кем-то, кто лучше понимает базу данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.