Spring Data JDBC

Spring Data JDBC

Шаблоны проектирования и реализации агрегатов на базе Spring Data JDBC.

SDJ на одной странице

По сути своей SDJ - простой как три копейки:

  1. Он работает с агрегатами

  2. Агрегат - это дерево с корнем

  3. Корень агрегата - это класс с аннотацией Table

  4. Границы агрегата - это все объекты достижимые из корня через разыменовывание java-ссылок

  5. Помимо скалярных ссылок, поддерживаются ещё и List, Set и Map

  6. Для List и Map в таблице вложенных сущностей заводится поле для индекса/ключа, которым рулит SDJ

  7. Работа всегда идёт через корень агрегата и со всем агрегатом целиком

    1. При вставке корня автоматически вставляется всё дерево

    2. При обновлении корня, корень обновляется, а все остальные сущности удаляются и вставляются заново

      1. К такой реализации и у меня есть вопросы, но сейчас так

    3. При удалении корня автоматически удаляется всё дерево

    4. При загрузке агрегата автоматически загружается всё дерево целиком

      1. OneToOne (просто поле) загружается JOIN-ом

      2. OneToMany (поле-коллекция) загружается доп. запросом

        1. При загрузке несколько агрегатов с OneToMany связями по умолчанию всегда будет проблема N+1

        2. Есть ещё экспериментальная поддержка загрузки агрегатов одним запросом, но у неё сейчас множество ограничений:

          1. Не поддерживаются вложенные коллекции;

          2. Не поддерживаются поля типа AggregateReference и вложенные сущности;

          3. Работает только с методами из CrudRepository - findById, findAll и т.д. - не работает выведеными (derived) запросами (аля findUserByLoginAndPassword) и кастомными запросами (в аннотации Query);

          4. По умолчанию отключена;

      3. ManyToMany нет по философии DDD. Если надо это замоделирровать, то надо явно завести вложенную сущность для таблицы ассоциации и либо сделать её самостоятельным агрегатом (если там с каждой стороны >20 сущностей может быть, либо если это кажется "разумным"), либо сделать эту сущность частью того агрегата, где их будет мало (например, в связке пост-тэг в блог платформе, связь делается частью поста, потому что у поста будет пара-тройка тэгов, а у тэга - неограниченное количество постов)

  8. Эвристика сборки агрегата: сущность добавляется в агрегат, если она удовлетворяет трём условиям:

    1. её жизненный цикл полностью ограничен корнем - невозможно создать сущность раньше корня агрегата, а после удаления корня агрегата её существование становится бессмысленным (она становится "сиротой")

    2. Кол-во сущностей в ассоциации ограниченное и небольше (< 20)

    3. Сущность создаётся в той же транзакции, что и корень

    4. У меня есть слайды с заметками докладчика об этом, надеюсь когда-нить таки запишу видео по ним

  9. Что ещё почитать:

  10. Возможно что-то из этих черновиков поможет уложить информационную модель (модель модели данных) Spring Data JDBC