JPA vs Spring JdbcTemplate



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




  • новая схема базы данных против уже существующей схемы и таблиц

  • уровень профессионализма разработчиков

  • простота, с которой можно интегрировать с кэшированием данных слоя

  • производительность

  • все другие уместные факторы к считаешь?

653   5  

5 ответов:

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

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

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

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

вы можете точно настроить jdbctemplate на основе backends лучше, но в большинстве случаев больше кода участвует.

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

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

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

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

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

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

лучшим решением было просто использовать JDBC на основе операции и "вставить через select" sql-вызовы для создания новых строк. Это было быстро, код был проще.

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

Это не упоминается в других ответах, но это нормально использовать оба. В моем приложении я использую 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.entityManager.queryForList("SELECT .. ",SomeProjectPojo.class); 
    }
}

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

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

Comments

    Ничего не найдено.