Где это возможно, следует ли исключать запросы SQL в пользу использования Hibernate? - PullRequest
0 голосов
/ 27 сентября 2018

Прочитав теорию Hibernate, я несколько раз сталкивался с идеей, что в идеальном мире вам не следует смешивать Hibernate с необработанными SQL-запросами по нескольким причинам, таким как Hibernate не может распознать изменения, которые были выполнены в этом.способ, который может оказать влияние, когда дело доходит до корректной очистки.

Мне дали задачу попытаться оптимизировать и улучшить несколько классов, которые взаимодействуют с базой данных, но делают это без прохождения через Hibernate.Они напрямую используют JdbcTemplate для выполнения запроса, и я заметил, что это чаще делается для операторов обновления.

Является ли это продуманным и хорошим дизайном, по какой-то причине, например, обновляется только определенное количество полей, а объект в базе данных довольно большой, или я должен стремиться реорганизовать эти классы, чтобы они использовали DAOклассы слоев для выполнения этих запросов на обновление?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Лично, после нескольких лет гибернации (которую я люблю больше, чем ненависти), я вижу две основные причины, по которым вы хотите делать только спальные запросы . Потенциально перемещение в другую базу данных, кэширование запросов будет другим.И то и другое, для меня, очень веские причины, если это важно для вас.Вы, вероятно, получите здесь больше ответов, почему это хорошо, поэтому я не буду рассказывать вам больше об этом.Вместо этого я мог бы сказать вам, почему это не всегда возможно в случаях, с которыми я действительно сталкивался.

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

Hibernate иногда скрывает намного больше, чем должен (это не его вина);если вы не понимаете, какие запросы будут генерировать в спящем режиме, вы часто будете очень удивлены.Я предлагаю вам постоянно проверять актуальные запросы.Другой пример - когда вы работаете с пессимистичными / оптимистичными блокировками - всегда просматривайте запросы, это не всегда тот случай, когда hibernate может генерировать то, что вы ожидаете ... (AzureSQL не имеет select for update - этоиспользует hints, например with row lock и т. д., что дает нулевую уверенность в том, что строка будет заблокирована, без надлежащего индекса и нескольких ресурсов, которые могут быть заблокированы для всей таблицы или страницы)

При этом явсегда старайтесь отдать предпочтение Hibernate в этом отношении, если что-то не работает так, как я ожидаю, - я использую нативные запросы, и такого ИМХО этого идеально сформированного мира просто не существует.

0 голосов
/ 27 сентября 2018

Существует множество преимуществ использования hibernate с HQL (Hibernate Query Language) вместо Native Queries (или Hibernate вместо JDBC), я констатирую 3 из них:

  1. Поддержка нескольких баз данных : если вы используете разные базы данных, это требование, но в вашем случае мы можем пояснить это на примере.Допустим, вы когда-нибудь решите изменить свой движок базы данных.Если ваше приложение полностью на HQL, вам просто нужно переключить параметр в hibernate conf, и он позаботится о «переработке» всех ваших запросов, чтобы они были совместимы с вашей новой базой данных.Только это.
  2. Соединение Java Objects: вы полностью определили этот аспект ( Hibernate не может распознать изменения, которые были выполнены таким образом, что может оказать влияние, когда оноправильно смывает ).Наличие ваших классов и полей, напрямую связанных с базой данных, позволяет вам лучше управлять изменениями кода и базы данных.Если ваш класс или поля внутри него изменены, компилятор проверит, все ли в порядке (я имею в виду спящий режим).И если вы используете мощный ide, такой как IntelliJ, он будет работать в другом направлении: если вы удалите или измените поле в своей базе данных, ваш ide предупредит вас о том, что что-то в вашем классе неверно (неверный столбец, недопустимый типи т. д.)
  3. Функции отслеживания и защиты : например, один на всех, sql инъекция.Плохой письменный запрос может подвергнуть вас проблемам безопасности, но в спящем режиме он позаботится об этом.И у него также есть мощная система кэширования ... еще одна вещь, которую он сделает для вас без особых усилий.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...