Создание репозитория только для чтения с помощью 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
}
Спасибо!
Ответы
Ответ 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();
}
Ответ 3
Насколько мы видим в документации, это возможно, реализуя org.springframework.data.repository.Repository.