it-swarm.com.ru

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

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

У меня есть некоторые сущности, связанные с представлениями, и некоторые дочерние сущности, для которых я хотел бы предоставить хранилище с некоторыми методами, такими как findAll(), findOne(), и некоторыми методами с @Queryannotation. Я хотел бы избежать предоставления таких методов, как 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
}

Спасибо!

21
jpboudreault

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

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, если это так, мы все еще можем направить вызовы в компонент реализации, поддерживающий прокси-сервер репозитория. Я написал более подробное сообщение в блоге об этой теме в блоге SpringSource.

44
Oliver Drotbohm

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

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();

}
20
Tristan Perry

Насколько мы можем видеть в документации, это возможно путем реализации org.springframework.data.repository.Repository .

6
Francisco Spaeth

У меня сработало следующее. Используя решение Оливера, я получил ошибку Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property findOne found for type при запуске.

@NoRepositoryBean
public interface ReadOnlyRepository<T,ID> extends Repository<T, ID> {
    Optional<T> findById(ID var1);
    boolean existsById(ID var1);
    Iterable<T> findAll();
    Iterable<T> findAllById(Iterable<ID> var1);
    long count();
}
0
Iqbal