2012-06-19 5 views
19

Возможно ли создание репозиториев только для чтения с использованием Spring Data?Создание репозитория только для чтения с SpringData

У меня есть некоторые объекты, связанные с видом и некоторые дочерние объекты, для которых я хотел бы предоставить репозиторий с некоторыми методами, как 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 
} 

Спасибо!

ответ

36

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

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

+0

Есть одна сложная вещь. Если я использую базу данных в памяти, такую ​​как HSQL для тестирования интеграции, я могу использовать метод сохранения представления для создания тестовых данных вместо создания связи между его объектами и их заполнения. Поэтому в этом случае мне понадобится метод сохранения вида только для тестирования, но не для производственного кода. Есть ли способ достичь этого? – DBS

14

Чтобы расширить ответ Оливера Гирки, в в более поздних версиях 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(); 

}