JPA против Spring JdbcTemplate [закрыто]

88

Для нового проекта всегда ли рекомендуется использовать JPA для обработки реляционных данных, или есть сценарии, в которых Spring JdbcTemplate является лучшим выбором? Некоторые факторы, которые следует учитывать при ответе:

  • новая схема базы данных по сравнению с ранее существовавшей схемой и таблицами
  • уровень экспертизы разработчика
  • простота интеграции со слоем кэширования данных
  • спектакль
  • какие-либо другие важные факторы, которые следует учитывать?
aem999
источник
2
Еще один фактор, который следует учитывать, - это стандартизация.
Эльдад Мор

Ответы:

147

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

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

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

Насколько мне известно, JPA легче подключается к слоям кэширования данных, поскольку объектно-ориентированный фокус упрощает идентификацию, обновление и аннулирование записей кэша.

Вы можете лучше настроить бэкенды на основе JdbcTemplate, но в большинстве случаев требуется больше кода.

Еще один аспект, который следует учитывать, заключается в том, что, хотя с JPA вы получаете модель предметной области для своей схемы базы данных, вам часто придется использовать дополнительные классы DTO. Используя JdbcTemplate, вы можете напрямую работать с классами DTO.

Тимо Весткемпер
источник
4
+1 хороший момент о разработчиках, которым необходимо знать реляционную базу данных, sql и транзакции. Однако JPA позволит вам рассматривать ваш уровень сохраняемости как объекты, поддерживаемые таблицами, а не только как таблицы.
Майкл Уайлс
@Timo Я пытаюсь понять это с точки зрения пула соединений. Так может ли JPA иметь источник данных, такой как HikarCP, с пулом соединений? Или JPA
справится с этим
79

Я немного опоздал с этим постом, но я предпочитаю использовать JdbcTemplate вместо ORM. Я знаю SQL (довольно хорошо) и действительно не хочу, чтобы меня «отвлекали» от моей БД. Я считаю, что большую часть времени мои приложения используют представления БД, куда я подталкиваю большую часть бизнес-логики. У меня есть правильно многоуровневые DAO, в которых есть реализации JdbcTemplate. Он кажется «чистым», и большая часть шаблонного кода скрыта JdbcTemplate (и его онлайн-документация кажется НАМНОГО лучше, чем материал ORM). Ограниченное время, которое я использовал что-то вроде Hibernate, я обнаружил, когда он работал, это сэкономило мне время ... но когда он не работал должным образом, это стоило мне дней отладки "WTF". Мне никогда не приходилось тратить более 20 минут на отладку импов JdbcTemplate DAO. Я думаю, что ключевым моментом, как отмечали другие, является то, насколько вам комфортно с SQL / Schema Design.

Джейсон
источник
49

Я согласен с @Timo. Единственное, что я хотел бы добавить / расширить, заключается в том, что ORM имеет семантику, отличную от чистого доступа sql к вашим данным.

Смысл ORM в том, чтобы максимально абстрагироваться от того факта, что ваши данные вообще находятся в БД. При правильном использовании ORM все операции с сохранением выполняются на одном (надеюсь) тонком слое. В ваших модельных объектах практически не будет кода сохранения; тот факт, что вы используете ORM, должен быть невидимым для вашей модели.

Из-за этого ORM очень хорошо облегчает вашу жизнь для определенных типов операций, а именно простых операций CRUD. Вы можете легко загрузить объекты модели, представить их, обновить и удалить. Это облегчает вашу жизнь, потому что, когда вы получаете доступ к своим данным, вы получаете обратно объекты модели, на которых вы можете писать бизнес-логику. Если вы используете JDBC, вам придется «гидратировать» экземпляры объектов из данных, что может быть сложным и подверженным ошибкам.

ORM - не всегда лучший выбор. JPA - это инструмент для работы, если этого инструмента недостаточно для работы, вы захотите найти лучший инструмент. Например, у меня был сценарий, в котором мне нужно было скопировать весь граф объекта и сохранить новую копию этих объектов. Если бы я использовал ORM (как я пытался это сделать), мне пришлось бы загрузить все объекты из БД, затем скопировать их, а затем сохранить новые объекты. Я потратил слишком много времени.

Лучшим решением было просто использовать операции на основе jdbc и вызовы sql «вставить через выбор» для создания новых строк. Это было быстро, код был проще.

Еще одна вещь, которую следует учитывать, это то, что вам комфортно с JDBC, и у вас есть крайние сроки, вам не нужно прыгать на подножку ORM. Классы Spring JdbcTemplate чрезвычайно эффективны и полезны. Иногда лучший инструмент для работы - тот, который вы знаете. Вам следует ознакомиться с ORM, но не обязательно для проекта с высокими ожиданиями. Есть чему поучиться, и это нетривиально - на самом деле вы торгуете одним набором сложностей с другим, выбирая jdbc против orm.

hvgotcodes
источник
9
+1 за заключительное утверждение. Как правило, это выбор между jdbc и orm, а не только для JPA и JdbcTemplate.
Parvez
2
как насчет объема памяти? есть ли большая разница между JdbcTemplate и Spring-Data-Jpa? (с hibernate, я думаю)
razor
36

Это не упоминается в других ответах, но можно использовать оба. В своем приложении я использую JPA и JdbcTemplate, для операций типа crud я использую JPA, но для отчетов или там, где это проще, я использую jdbcTemplate.

@Repository
public class FooRepository
{
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired(required = true)
    private JdbcTemplate jdbcTemplate;

    public void saveFoo(Foo foo)
    {
         this.entityManager.persist(foo);
    }

    public List<SomeReportPojo> getSomeReport()
    {
         return this.jdbcTemplate.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

Самое замечательное в Spring заключается в том, что преобразование исключений из исключений JPA в иерархию исключений Spring Dao работает как с JPA, так и с jdbcTemplate. Поэтому используйте JPA, когда это имеет смысл, и jdbcTemplate, когда это имеет смысл.

амс
источник
20
Должна ли линия getSomeReport()быть this.jdbcTemplate. ...лучше, чем this.entityManager. ...?
Ян Зыка
Как вы объявляете bean-компонент JdbcTemplate, если не используете XML, а только аннотации? Spring не выполняет это автоматически: я получаю исключение NoSuchBeanDefinitionException: не найдено
подходящего
5

В работе мы используем Hibernate JDBCTemplate, потому что он более гибок. Он также имеет лучшую производительность, чем JPA, потому что вы не «загружаете» много ненужных данных в свое приложение.
В случае с JDBCTemplate ваши навыки SQL имеют большое значение, чтобы дать вам именно то, что вам нужно, с нужной скоростью.

user3131171
источник
2
Добрый день, не могли бы вы прояснить «hibernate jdbctemplate», что это значит? Комбинация Hibernate и Spring JDBCTemplate или что-то еще?
qizer