Вы должны иметь один репозиторий на таблицу в JPA?
Вы должны иметь один репозиторий на таблицу в JPA? Если нет, то как вы разрешаете дженерики в базе данных репозитория?
Например, ниже StoreRepository
, Он обрабатывает операции CRUD на Store
объект. Если бы я хотел, чтобы хранилище сохранило StoreEvent
объект, как бы я изменил интерфейс ниже для размещения обоих объектов?
@Repository
public interface StoreRepository extends JpaRepository<Store, String> {
public Store findByGuid(String guid);
}
1 ответ
Поскольку репозиторий является концепцией, основанной на домене, дизайн, думая о таблицах базы данных, это неправильный подход. По определению вы получаете доступ к совокупным корням из хранилища. По сути, хранилище имитирует их коллекцию.
Теперь, что формирует совокупный корень? Наверное, еще интереснее: что нет? Это, конечно, сильно зависит от вашего домена, но позвольте мне привести здесь пример. Order
содержащий LineItems
обычно моделируется как совокупный корень. Это связано с композиционной природой Order
, LineItem
не было бы без окружения Order
,
Обычно механизмы постоянного доступа должны следовать принципам домена. Таким образом, вы будете моделировать оба Order
а также LineItem
как @Entity
классы, но только создать OrderRepository
, как форма совокупного корня и эффективно контролировать правила согласованности в графе объектов.
Мы также настоятельно рекомендуем не использовать специфичные для магазина базовые интерфейсы репозитория, поскольку они - как следует из названия - раскрывают специфику магазина (например, flush()
) клиентам, о которых не следует знать, если это возможно. Подробнее об этом в моем ответе здесь.