
Что вам нужно знать про семантику List и Set в Hibernate
mipo256 2 минуты назад Что вам нужно знать про семантику List и Set в Hibernate Средний 8 мин 1 Блог компании Spring АйО Программирование * Java * Обзор Привет, друзья!На связи Михаил Поливаха, технический лидер проекта...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. mipo256 2 минуты назад Что вам нужно знать про семантику List и Set в Hibernate Средний 8 мин 1 Блог компании Spring АйО Программирование * Java * Обзор Привет, друзья! На связи Михаил Поливаха, технический лидер проекта Axelix. В рамках Spring АйО Академии я встречал большое количество похожих вопросов, посвященных правильному дизайну сущностей и т.
Я обещался на все эти вопросы ответить в рамках статьи. На самом деле, одной статьи у меня не вышло, скорее всего, будет серия статей. Надеюсь, будет интересно :)Elephant In the Room: AIПеред тем как начнём, я хочу адресовать слона в посудной лавке.
Технические детали
Многие знания о том, “как надо” можно оформить в Skill для AI Agent-а, и я считаю, что лучше так и сделать. С другой же стороны, я постараюсь сфокусироваться не на том, как “правильно”, а на том, почему правильно именно таким образом. Я до сих пор считаю, что знания и компетенции качественного инженера имеют огромную ценность и в эру AI это остается так.
Я постараюсь пояснить причины того или иного поведения, а не просто сказать, что нужно делать так. List vs SetЭто извечный вопрос, и на него уже много раз отвечали. Я лишь поясню, почему ответ именно такой, какой он есть.
Начать нужно с того, что когда вы используете List или Set, вы неявно коммуницируете для Hibernate определенную семантику. Hibernate, поскольку является ORM фреймворком, работает поверх SQL. А в SQL таблица без ограничений уникальности это по сути “Bag” - коллекция, где мы не можем гарантировать отсутствие дубликатов, и где отсутствует чёткий порядок элементов.
Отраслевые последствия
В Java отсутствует как таковой тип для “Bag”, поэтому Hibernate предполагает, что, когда вы используете List без @OrderColumn, вы имеете в виду коллекцию, где вы:Не гарантируете никакой порядок элементовИ к тому же, где вы заявляете, что не гарантируете уникальность элементов. Это всё мы уже в рамках Spring АйО Академии разбирали, я думаю, для многих тут ничего нового нет, но теперь смотрите. ManyToManyВ интернете пишут, что в ManyToMany надо использовать Set всегда, потому что в случае с листом Hibernate делает следующее:Удаляет все элементы из связующей таблицы для данной сущностиДелает re-INSERT оставшихсяЯ хочу пояснить, почему Hibernate это делает, и почему по-другому он не может.
Давайте рассмотрим many-to-many связку Developer <-> Project. Рассмотрим оба варианта - и List и Set, и как каждый из них воспринимает Hibernate:@Entity class И таблицу связи:CREATE TABLE developer_project( developer_id bigint not null, project_id bigint not null ) На первый взгляд всё просто. И теперь представим себе, что как раз мы хотим отвязать того или иного Developer-а от того или иного проекта.
По сути дела, должна уйти одна запись из таблицы developer_project. Ключевой вопрос, который я попрошу вас держать сейчас в голове:Как дизайнеры ORM фреймворка, можем ли мы с вами однозначно идентифицировать (! ) конкретную строку, которую нужно удалить из join-таблицы?
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




