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