В чем разница между Hibernate и Spring Data JPA
Каковы основные различия между Hibernate и Spring Data JPA? Когда не следует использовать Hibernate или Spring Data JPA? Кроме того, когда шаблон Spring JDBC может работать лучше, чем JPA Hibernate / Spring Data?
4 ответа
Hibernate - это реализация JPA, а Spring Data JPA - абстракция доступа к данным JPA. Spring Data предлагает решение для GenericDao
пользовательские реализации. Он также может генерировать JPA-запросы от вашего имени с помощью соглашений имен методов.
В Spring Data вы можете использовать Hibernate, Eclipse Link или любого другого поставщика JPA. Очень интересным преимуществом является то, что вы можете декларативно контролировать границы транзакций, используя @Transactional
аннотация.
Spring JDBC намного легче и предназначен для собственных запросов, и если вы собираетесь использовать только JDBC, то лучше использовать Spring JDBC для обработки многословности JDBC.
Таким образом, Hibernate и Spring Data дополняют друг друга, а не являются конкурентами.
Здесь мы используем 3 разные вещи:
- JPA: API персистентности Java, который предоставляет спецификацию для сохранения, чтения, управления данными из вашего Java-объекта и отношений в базе данных.
- Hibernate: Есть различные провайдеры, которые реализуют jpa. Hibernate является одним из них. Так что у нас есть и другой провайдер. Но если использовать jpa с пружиной, это позволит вам в будущем переключаться на разных провайдеров.
- Spring Data JPA: это еще один слой поверх jpa, который предоставляет Spring для облегчения вашей жизни.
Итак, давайте разберемся, как работает Spring data jpa и spring + hibernate-
Spring Data JPA:
Допустим, вы используете Spring + Hibernate для вашего приложения. Теперь вам нужно иметь дао-интерфейс и реализацию, где вы будете писать операцию crud, используя SessionFactory из hibernate. Допустим, вы пишете класс dao для класса Employee, завтра в вашем приложении может потребоваться написать аналогичную операцию crud для любой другой сущности. Таким образом, есть много шаблонного кода, который мы можем увидеть здесь.
Теперь данные Spring jpa позволяют нам определять интерфейсы dao, расширяя его репозитории (crudrepository, jparepository), чтобы обеспечить реализацию dao во время выполнения. Вам больше не нужно писать реализацию dao. Вот как Spring data jpa облегчает вашу жизнь.
Я не согласен, 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, который поможет вам в ваших задачах:)
Spring Data
это удобная библиотека поверх JPA
который абстрагирует многие вещи и привносит магию Spring (нравится вам это или нет) в доступ к хранилищу сохраняемости. В основном он используется для работы с реляционными базами данных. Короче говоря, он позволяет объявлять интерфейсы с такими методами, какfindByNameOrderByAge(String name);
который будет проанализирован во время выполнения и преобразован в соответствующий JPA
запросы.
Его размещение поверх JPA
делает его использование привлекательным для:
Новички-разработчики, которые не знают
SQL
или знать это плохо. Это верный путь к катастрофе, но им может сойти с рук, если проект тривиален.Опытные инженеры, которые знают, что делают, и хотят быстро наладить работу. Это может быть жизнеспособной стратегией (но читайте дальше).
Из моего опыта работы с 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-запросами и почти никогда не сталкиваетесь с библиотекой.
Если вы предпочитаете простоту и больший контроль над SQL-запросами, я бы предложил использовать Spring Data/ Spring JDBC.
Его хороший объем обучения в JPA и иногда трудно отладить проблемы. С другой стороны, хотя у вас есть полный контроль над SQL, становится намного проще оптимизировать запросы и повысить производительность. Вы можете легко поделиться своим SQL с администратором базы данных или кем-то, кто лучше понимает базу данных.
Hibernate является реализацией "JPA", которая является спецификацией для объектов Java в базе данных.
Я бы порекомендовал использовать в JPA, поскольку вы можете переключаться между различными ORMS.
Когда вы используете JDBC, вам нужно использовать SQL-запросы, поэтому, если вы разбираетесь в SQL, тогда переходите на JDBC.