Репозитории данных

Репозитории данных Spring Data предоставляют полезную абстракцию для работы с сущностями, особенно для реализации бизнес-логики.

Репозитории данных Jmix построены на базе Spring Data, но внутри используют DataManager. Это позволяет использовать удобный интерфейс репозиториев и при этом иметь полную поддержку продвинутых возможностей доступа к данным Jmix, таких как события сущностей, ссылки между сущностями из разных хранилищ, проверки доступа к данным и т.п.

В текущей версии 2.2 API репозиториев данных Jmix помечен как экспериментальный. В следующем функциональном релизе в него могут быть внесены незначительные изменения и API станет стабильным.

Работа с репозиториями данных

  1. Создайте интерфейс, унаследованный от JmixDataRepository. Используйте класс сущности и класс идентификатора сущности в качестве параметров типа JmixDataRepository. Например:

    public interface CustomerRepository extends JmixDataRepository<Customer, UUID> {
    }
  2. Добавьте аннотацию @EnableJmixDataRepositories главному классу приложения или классу конфигурации дополнения:

    @SpringBootApplication
    @EnableJmixDataRepositories
    public class SampleDataAccessApplication {

    Jmix проинициализирует все репозитории данных, расположенные внутри и ниже базового пакета приложения или дополнения. Если требуется более тонкая настройка поиска репозиториев, используйте атрибуты аннотации basePackages, excludeFilters и includeFilters.

  3. Инжектируйте репозиторий в бины Spring или UI-контроллеры с помощью аннотации @Autowired:

    @Autowired
    private CustomerRepository customerRepository;

Особенности JmixDataRepository

Интерфейс JmixDataRepository расширяет стандартный интейфейс PagingAndSortingRepository из Spring Data. Он предоставляет несколько собственных методов, учитывающих специфику Jmix:

  • Методы загрузки, такие как findById() или findAll(), могут принимать фетч-план.

  • Метод create() создает новый экземпляр сущности.

  • Метод getById() с обязательным результатом загружает сущность по идентификатору и выбрасывает исключение, если сущность не найдена.

Следующие аннотации можно использовать на кастомных методах запросов:

  • @io.jmix.core.repository.Query задает строку JPQL аналогично аннотации @Query в Spring Data JPA.

  • @io.jmix.core.repository.FetchPlan задает фетч-план для загрузки данных.

Примеры методов запросов

Репозитории данных Jmix поддерживают стандартную возможность Spring Data выводить запрос из имени метода, например:

List<Customer> findByEmailContainingIgnoreCase(String emailPart);

Аналогично Spring Data JPA, JPQL-запрос можно явно задать с помощью аннотации @io.jmix.core.repository.Query:

@Query("select c from sample_Customer c where c.email like :email")
List<Customer> findCustomersByEmail(@Param("email") String emailPart);

Методы запросов могут принимать объект Pageable для постраничной загрузки и сортировки:

Page<Customer> findByEmailContainingIgnoreCase(String emailPart, Pageable pageable);

Другой специально обрабатываемый параметр, который можно использовать в методах запросов - фетч-план:

List<Customer> findByEmailContainingIgnoreCase(String emailPart, FetchPlan fetchPlan);

Разделяемый фетч-план можно задавать по имени в аннотации @io.jmix.core.repository.FetchPlan:

@FetchPlan("customer-minimal")
List<Customer> findByEmail(String email);