Spring Data JDBC / Spring Data JPA против Hibernate

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

5 ответов

Решение

Как сказал @Naros, вопрос, как он есть в заголовке, на самом деле не работает. Похоже, нам действительно стоит рассмотреть 4 варианта и в основном перечислить плюсы каждого подхода, минусы - отсутствие плюсов другого:

JDBC без данных Spring

Вы получаете 100% детальный контроль над происходящим. Ничто не генерируется или вводится рамками. Это может звучать как мошенничество, но если вы попытались настроить сопоставления и конфигурации, чтобы заставить некоторую реализацию JPA выполнять то, что вы могли бы просто записать в java и SQL, вы поймете, что это может быть большим профессионалом.

Вам не нужно изучать JPA или Spring Data. Я лично думаю, что Spring Data - это легко, но я предвзят (см. Мой профиль). Но JPA, безусловно, является сложной задачей, когда вы покидаете область тривиальных сущностей и настроек.

  • нет требований по моделированию модели вашего домена (например, JPA требует конструкторов по умолчанию)

Вы, вероятно, хотите использовать некоторую библиотеку, чтобы сократить стандартный код. Взгляни на:

  • JOOQ

  • MyBatis

  • Spring JdbcTemplate (может использоваться без остальной части Spring)

  • QueryDsl

JDBC с данными Spring

Вы получаете преимущества Spring Data в сочетании с преимуществами JDBC (см. Выше):

  • Репозитории с методами CRUD из коробки.

  • Хорошая интеграция в инфраструктуру Spring, для обработки транзакций, внедрения зависимостей, трансляции ошибок, подкачки страниц...

  • Это все еще очень простая модель программирования. Операторы SQL выполняются именно тогда, когда от них можно ожидать, и если вы захотите, можете вернуться к простому JDBC с поддержкой или без поддержки других сред, не нарушая абстракции.

Пока не доступно, но вы получите еще больше вкусностей с будущими обновлениями:

  • Хорошие и простые способы расширить ваши репозитории с помощью методов запросов (вы просто определяете свой интерфейс, чтобы иметь findByLastName метод и Spring генерирует его для вас на лету) или @query аннотации или пользовательские методы.

  • Поддержка подкачки

Hibernate (или другая реализация JPA) без Spring Data

JPA много чего делает над JDBC

  • Кэширование (1-й, 2-й уровень и кеш запросов)

  • Автоматическое создание экземпляров из запросов

  • Навигация между сущностями

  • Ленивая загрузка

Когда все это происходит, может быть трудно понять, что происходит и почему. Конечно, если вы правильно структурируете свое приложение, вы можете просто вернуться к JDBC, если JPA не предлагает то, что вы хотите. Но я неоднократно видел, что люди не смогли поддерживать структуру, необходимую для того, чтобы это работало. Очевидно, что это особенно сложно, если вы не понимаете должным образом, как работает JPA.

Hibernate (или другая реализация JPA) с Spring Data

Я перечислил преимущества Spring Data выше, просто мысленно скопируйте и вставьте.

Конечно, это делает весь стек еще более сложным. Судя по многим вопросам, помеченным как spring-data и hibernate, у многих разработчиков возникают проблемы с определением, какой инструмент для чего предназначен. Но, глядя на эти вопросы, большинство описывают проблемы с Hibernate/JPA, а не с Spring Data.

Чтобы обернуть это:

  • Если вы хотите / нуждаетесь в детальном контроле, используйте JDBC.

  • Если вы собираетесь использовать JPA, убедитесь, что вы поняли это на ранней стадии.

  • Если для технологии персистентности, которую вы выбираете, Spring Data предлагает модуль, я бы использовал его. Это облегчит жизнь. Но опять я пристрастен.

Одна проблема с вашим вопросом заключается в том, что вы, похоже, подразумеваете, что Spring Data JPA похож на Hibernate, и это на самом деле не так. Spring Data JPA - это просто ориентированная на пружину оболочка, которая предлагает упругую семантику и функции, которые обертывают JPA-провайдера, одной из реализаций которого является Hibernate.

Следовательно, вы не можете использовать Spring Data JPA, не включая некоторые реализации JPA, такие как Hibernate.

Основной вопрос, который вы задаете, заключается в том, зачем использовать JDBC против ORM. Чтобы понять, что вам нужно время, чтобы понять преимущества ORM. В Интернете есть множество статей, которые могут вам это дать.

Но даже в приложении, управляемом ORM, будут случаи, когда вам придется обходить среду ORM и использовать собственный SQL, как в случае с JDBC. Такие случаи часто редки, но необходимы, когда вы хотите воспользоваться какой-либо неподдерживаемой функцией базы данных или когда вы хотите иметь полный контроль над манипулированием результатами и т. Д.

Решающий фактор для использования в конечном итоге зависит от потребностей вашего приложения. Но только то, что вы решили использовать среду ORM, не исключает взаимной возможности выполнять собственные запросы и операторы SQL, как в JDBC. Эти функции все еще доступны, вы просто используете их в редких случаях.

Дело в том, что данные Spring для jpa - это абстракция над jpa, которая является абстракцией над JDBC. Если предложить хорошие функции, даже если jpa можно использовать без него. Это становится действительно мощным с Spring данных отдыха.

Но чем больше фреймворк делает для вас, тем больше вам нужно понимать основную технологию. Это еще более верно, если вы используете spring-data-rest. Лучше всего начать с понимания sql (дизайн и запросы), а затем jpa (ленивая загрузка, состояния экземпляров, сущностей, встраиваемых объектов, кэшей, запросов, синхронизации транзакций).

Затем вы пробуете spring-data-jpa и решаете, принесет ли это пользу вашему проекту. Для операций сохранения, обновления, удаления и поиска по идентификатору это в основном оболочка persist, merge, remove а также find метод EntityManager, Основным преимуществом данных JPA Spring является поддержка запросов, но querydsl также является хорошим вариантом. В обоих случаях требуется четкое понимание того, как работает JPA. Первое, что нужно сделать, это включить ведение журнала SQL, чтобы увидеть, выполняет ли ваша реализация jpa запросы, которые dba посчитает правильными для данного доступа к БД. Например, активная загрузка объекта, который не находится в кеше, приводит к выбору 1+n, ваш модульный тест пройдет, и начнутся проблемы в производстве. spring-data-jpa не решит проблему за вас.

Помимо spring-data-jpa есть много spring-data- *, некоторые из них также предлагают аннотации сопоставления (например, spring-data-cassandra), что полезно, когда нет сопоставления object-db.

Я искал ответ на это. Следующее сравнение взято из Java Persistent with Spring Data и Hibernate .

Я могу понять, что может возникнуть ситуация, когда пользовательская функциональность, которая должна работать с функциональностью базы данных, которую предоставляет Spring Data JPA. Или, возможно, мы хотим избежать такой сложности, которая возникает из-за магии данных Spring.

Проверьте http://requery.io/, обеспечить запрос производительности и ORM.

также проверьте Spring-Data-Requery

Другие вопросы по тегам