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