Подтвердить что ты не робот

Создание репозитория только для чтения с помощью SpringData

Можно ли создавать репозитории только для чтения, используя Spring Данные?

У меня есть некоторые объекты, связанные с представлениями и некоторыми дочерними объектами, для которых я хотел бы предоставить репозиторий с некоторыми методами, такими как findAll(), findOne() и некоторые методы с аннотацией @Query. Я хотел бы избежать предоставления таких методов, как save(…) и delete(…), поскольку они не имеют смысла и могут создавать ошибки.

public interface ContactRepository extends JpaRepository<ContactModel, Integer>, JpaSpecificationExecutor<ContactModel> {
    List<ContactModel> findContactByAddress_CityModel_Id(Integer cityId);

    List<ContactModel> findContactByAddress_CityModel_Region_Id(Integer regionId);

    // ... methods using @Query

    // no need to save/flush/delete
}

Спасибо!

4b9b3361

Ответ 1

Да, путь - добавить базовый репозиторий ручной работы. Обычно вы используете что-то вроде этого:

public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

  T findOne(ID id);

  Iterable<T> findAll();
}

Теперь у вас есть конкретные варианты репозиции, которые только что определены:

public interface PersonRepository extends ReadOnlyRepository<Person, Long> {

  T findByEmailAddress(String emailAddress);
}

Важнейшая часть, определяющая базовое репо, заключается в том, что декларации метода несут ту же подпись, что и методы, объявленные в CrudRepository, если в этом случае мы все равно можем перенаправить вызовы в реализацию bean, поддерживая прокси-сервер репозитория. Я написал более подробное сообщение в блоге об этой теме в блоге SpringSource.

Ответ 2

Чтобы развернуть ответ Оливера Гирке, в более поздних версиях Spring Data вам понадобится аннотация @NoRepositoryBean, чтобы предотвратить ошибки запуска приложения:

import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.Repository;

@NoRepositoryBean
public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {

    T findOne(ID id);

    List<T> findAll();

}