惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
月光博客
月光博客
AI
AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
CXSECURITY Database RSS Feed - CXSecurity.com
WordPress大学
WordPress大学
GbyAI
GbyAI
L
Lohrmann on Cybersecurity
O
OpenAI News
Schneier on Security
Schneier on Security
P
Palo Alto Networks Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Troy Hunt's Blog
V2EX - 技术
V2EX - 技术
W
WeLiveSecurity
L
LINUX DO - 最新话题
人人都是产品经理
人人都是产品经理
S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
A
Arctic Wolf
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
TaoSecurity Blog
TaoSecurity Blog
C
Check Point Blog
Scott Helme
Scott Helme
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Vercel News
Vercel News
The Hacker News
The Hacker News
Y
Y Combinator Blog
Latest news
Latest news
SecWiki News
SecWiki News
Hugging Face - Blog
Hugging Face - Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Google Online Security Blog
Google Online Security Blog
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Recent Commits to openclaw:main
Recent Commits to openclaw:main
C
Cisco Blogs
博客园_首页
H
Hackread – Cybersecurity News, Data Breaches, AI and More
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
ORM — есть ли профит? Особенно когда по двору бегает ИИ-шка
Евгений · 2026-06-23 · via Все публикации подряд на Хабре

Простой

7 мин

43

Сгенерировано Чатом ГПТ

Сгенерировано Чатом ГПТ

ORM — Object-Relational Mapping — Объектно-реляционное отображение — это технология, позволяющая связывать SQL-ые БД с ООП кодом. Самая известная из них — Hibernate.

Hibernate — очень красивая технология. Она формирует ощущение магии.

Ты просто создаёшь объект, — хлабысь! — он уже в базе данных. Никакого SQL, никаких соединений, никаких ResultSet. Всё происходит как будто само собой. Прелесть.

Именно поэтому отказаться от Hibernate так тяжело.

Это напоминает Кольцо Всевластия из «Властелина колец». Оно не просто давало силу — оно меняло сознание своего владельца. Оно внушало мысль, что без него уже нельзя. Что именно оно даёт власть и контроль.

Hibernate действует очень похоже. Он формирует ощущение, что именно он управляет данными. Что именно он связывает код с базой. Что без него всё развалится.

И ты начинаешь бояться.

Бояться, что без Hibernate придётся писать бесконечный SQL. Бояться, что потеряешь контроль над данными. Бояться, что любая операция с базой превратится в мучение.

Ты уже не представляешь себе проект без этой магии. Ты настолько к ней привык, что мысль «выкинуть Hibernate» кажется почти кощунственной. Кажется, будто вместе с ним исчезнет и сама возможность нормально работать с базой данных.

Но если всё-таки посмотреть на ситуацию трезво и задать себе простой вопрос:

А что на самом деле даёт Hibernate?

Кажется, что он ускоряет разработку. Возможно. Пока ты джуниор, ты восхищаешься тем, как легко всё работает. Создал объект, вызвал persist(), и данные уже в базе. Магия.

Но с опытом начинаешь замечать вещи, на которые раньше не обращал внимания.

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

Пока это лишь отдельные мысли. Отдельные капли сомнений.

Каждая сама по себе ничего не меняет.

Но однажды наступает момент, когда последняя капля переполняет чашу.

У меня этот процесс начался с двух проектов.

Один был мой — на Hibernate. Я им искренне восхищался.

Второй был написан на обычном JDBC.

Каждый запрос выглядел примерно одинаково:

String sql = "select...";
PreparedStatement ps = ...
ResultSet rs = ...
model.setX(rs.getX(...));
model.setY(rs.getY(...));

Честно говоря, это выглядело ужасно. Попахивает утечками ресурсов.

Кринжово.

Допотопно.

Будто после современного автомобиля тебя посадили за трактор.

Но был один нюанс.

SQL-проект вся команда считала гораздо проще моего. Хотя он был почти в три раза больше. Я специально считал количество экранных форм и таблиц в базе.

И самое интересное — на том проекте джуниорам спокойно разрешали коммитить практически сразу. Никто особенно не боялся, что они что-нибудь сломают.

И они действительно почти ничего не ломали.

А к моему проекту на Hibernate разработчиков ниже уровня Middle старались вообще не подпускать.

Эта мысль тогда крепко засела у меня в голове, и дала парочку капель для будущего переполнения чаши.

Потом произошёл другой случай.

Бизнес попросил добавить очень простую функцию. По ID нужно было закрыть активность — просто установить один флаг в true. Код получился буквально элементарным. Я загрузил сущность через load(), выставил поле, а дальше Hibernate сделал всё сам. Нужен был всего один тест и он прошёл нормально. Ручное тестирование прошло нормальноё. Выкатили в прод.

Через две недели бизнес пришёл с претензией.

Не все активности закрывались.

Я был абсолютно уверен, что проблема не в моём коде.

Ну что там может не работать?

Я даже сказал бизнесу:

— Скорее всего, операторы иногда просто не нажимают на кнопку.

Бизнес сначала согласился.

Но потом опять вернулся.

Уже очень злой. Сеньёр написал один метод из одной строки и это не работало. Все посматривали на меня с немым вопросом. То ещё ощущение.

Я обложил всё логами. Выяснилось, что операторы действительно нажимали кнопку.

Но флаг иногда... не сохранялся.

Почему?

Я понятия не имел.

На меня смотрели все.

Для бизнеса эта функция напрямую влияла на деньги, поэтому давление было колоссальным и решить эту задачу нужно было немедленно.

Единственное решение, которое пришло мне в голову, — переписать эту функцию на чистом JDBC, с простым SQL-ем: update... where id=?.

Полчаса работы.

Выкатили.

И проблема исчезла.

Навсегда.

Позже я всё-таки разобрался.

Оказалось, что load() загружал всю сущность, а при коммите Hibernate сохранял обратно все её поля. Если параллельно кто-то изменял эту же запись, происходила потеря обновления. Моё изменение откатывалось другим сохранением.

Нужно было всего лишь поставить @DynamicUpdate.

Я знал про эту аннотацию. Но под давлением просто не вспомнил о ней.

Казалось бы, вывод очевиден.

Я просто получил новый опыт. Теперь я знаю, что в подобных случаях нужно ставить @DynamicUpdate. Стал ещё лучше разбираться в Hibernate. Значит, стал сильнее как разработчик.

Круто.

Именно так я тогда и должен был подумать.

Но мысли были совсем другими.

Не то, что-то с таким подходом. Не доложно быть так. Не может нормальная технология лажать в методе из одной строки. Почему для обновления одного булевого поля вообще нужно знать про существование @DynamicUpdate? Почему простейшая операция зависит от таких нюансов? Почему, чтобы система работала надёжно, я должен помнить десятки подобных особенностей?

И тогда в голове впервые прозвучал вопрос, который потом уже не давал мне покоя:

А зачем вся эта сложность?

Все знают одно из главных преимуществ Hibernate: он якобы практически не зависит от конкретной СУБД. Поменял диалект, параметры подключения — и приложение готово работать с другой базой данных. По крайней мере, именно так это обычно преподносят. Я тоже в это верил.

И тут произошло самое интересное.

Оба этих проекта нужно было переводили с Oracle на PostgreSQL.

Казалось бы, результат очевиден. Я был уверен, что мой проект мигрирует быстро и почти безболезненно, а разработчики SQL-проекта будут долго переписывать запросы и разбираться с различиями между СУБД.

Реальность оказалась ровно противоположной.

SQL-проект вышел в промышленную эксплуатацию уже через полгода. Мой проект на Hibernate — только через год. И это при том, что SQL-проект был примерно в три раза больше по объёму.

Причина оказалась простой. В SQL-проекте разработчикам нужно было лишь адаптировать SQL-запросы под новую СУБД. Да, часть запросов пришлось переписать, но это была понятная, локальная и достаточно быстрая работа.

В проекте на Hibernate всё оказалось иначе. Вместо обещанной независимости от СУБД пришлось разбираться с множеством особенностей ORM: несовместимостью HQL-запросов, изменившимися планами выполнения, падением производительности, нюансами диалектов и другими эффектами, скрытыми за «магией» Hibernate.

В итоге проект, который по объёму был значительно меньше, мигрировался почти в два раза дольше. И это в абсолютном аспекте — помните SQL-ый проект в три раза больше.

На практике всё оказалось совсем не так. Просто поменять диалект и параметры подключения к базе данных не получилось.

Из-под всей этой «магии» Hibernate сразу начали всплывать подводные камни. Например, в Oracle связка Query + HQL работала нормально, а в PostgreSQL — уже нет. Многие запросы, которые раньше казались вполне приемлемыми, стали работать непозволительно медленно, и их пришлось вручную анализировать и оптимизировать. Всплыли различия в диалектах, особенностях генерации SQL и поведении самого ORM.

И это лишь несколько примеров. Вместо обещанной независимости от СУБД мы получили длительную и трудоёмкую адаптацию приложения к новой базе данных.

Получается парадоксальная ситуация: технология, которая должна была скрыть различия между СУБД, на деле сама стала источником дополнительных проблем при миграции.

И тут я наконец прозрел: а зачем вообще нужна вся эта сложность, если её можно просто убрать и сделать систему на порядок проще?

Часто говорят, что писать SQL вручную и маппить ResultSet в модели через getXXX()/setXXX() — скучно и неудобно. Возможно. Но это всего лишь эмоции разработчиков.

Возникает вопрос: зачем за эти эмоции платить бизнесу? Зачем увеличивать стоимость разработки и особенно сопровождения только ради того, чтобы не писать несколько десятков строк понятного кода?

На мой взгляд, если технология требует изучения огромного количества внутренней механики, усложняет отладку, многопоточность и сопровождение, то она должна давать соразмерную выгоду. Если же выигрыш ограничивается тем, что разработчик пишет меньше SQL и меньше шаблонного кода, возникает закономерный вопрос: оправдывает ли это те дополнительные затраты, которые в итоге несёт бизнес?

Разработка в проекте занимает всего около 10% общего времени, поэтому даже заметное ускорение этого этапа мало что меняет. Да и само ускорение — ещё большой вопрос. Зато на сопровождение Hibernate уходит огромное количество времени. Он заставляет изучать весьма сложную технологию со всеми её EntityManager'ами, flush'ами, жизненным циклом сущностей и особенностями работы @Transactional. А когда в проекте появляется многопоточность, всё становится на порядок сложнее.

И, конечно, здорово, когда ты во всём этом разбираешься. Но неизбежно возникает вопрос: а зачем? Зачем тратить столько времени на изучение инфраструктуры, которая не решает бизнес-задачи, а лишь обслуживает саму себя?

А теперь давайте вспомним, что мир изменился.

Появились ИИ-агенты.

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

И самое главное — писать их теперь будете не вы.

Вам останется только прочитать код, проверить, что он делает именно то, что нужно, и при необходимости немного подправить.

Получается любопытная вещь.

Ещё совсем недавно одним из главных аргументов в пользу Hibernate было избавление разработчика от рутинного написания SQL.

Но если рутину теперь выполняет ИИ практически бесплатно, то этот аргумент начинает стремительно терять силу.

И тогда возникает закономерный вопрос.

Если SQL больше не является проблемой, то ради чего мы продолжаем платить за всю сложность Hibernate? За его внутреннюю магию, скрытые механизмы, нюансы жизненного цикла сущностей, flush, merge, @Transactional, @DynamicUpdate и десятки других особенностей?

В этот момент призрачная необходимость в Hibernate, если она ещё оставалась после всего сказанного, исчезает в ноль, от слова совсем.

За годы работы я понял одну простую вещь: самое дорогое в проекте — не разработка, а его сопровождение и развитие. А для этого важно, чтобы система ломалась как можно реже. И здесь действует почти универсальное правило: чем система проще, тем она надёжнее.

Hibernate — очень сложная технология, под капотом которой скрывается огромное количество внутренней механики. И проблемы могут возникнуть где угодно: в жизненном цикле сущностей, стратегиях загрузки, кэше, flush, транзакциях, особенностях dirty checking, генерации SQL, аннотациях, о которых легко забыть, и ещё десятках мест, не имеющих никакого отношения к бизнес-логике.И каждый раз, когда возникает очередная такая проблема, невольно задаёшь себе один и тот же вопрос.

А зачем?

Зачем усложнять систему, если можно сделать её проще?

Для себя я на этот вопрос уже ответил.

А появление ИИ лишь окончательно убедило меня, что возвращаться назад смысла уже нет.

От слова «совсем».