복붙노트

[SPRING] Spring 데이터로 읽기 전용 저장소 만들기

SPRING

Spring 데이터로 읽기 전용 저장소 만들기

스프링 데이터를 사용하여 읽기 전용 리포지토리를 생성 할 수 있습니까?

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
}

감사!

해결법

  1. ==============================

    1.그렇습니다. 직접 만드는 방법은 수제 기본 저장소를 추가하는 것입니다. 일반적으로 다음과 같은 것을 사용합니다.

    그렇습니다. 직접 만드는 방법은 수제 기본 저장소를 추가하는 것입니다. 일반적으로 다음과 같은 것을 사용합니다.

    public interface ReadOnlyRepository<T, ID extends Serializable> extends Repository<T, ID> {
    
      T findOne(ID id);
    
      Iterable<T> findAll();
    }
    

    이제 정확히 정의 된 repos를 확장 할 수 있습니다 :

    public interface PersonRepository extends ReadOnlyRepository<Person, Long> {
    
      T findByEmailAddress(String emailAddress);
    }
    

    기본 저장소를 정의하는 중요한 부분은 메소드 선언이 CrudRepository에 선언 된 메소드와 동일한 서명을 가지고 있다는 것입니다. 그렇다면 호출을 저장소 빈을 지원하는 구현 빈으로 라우트 할 수있는 경우입니다. SpringSource 블로그에서 그 주제에 대한보다 자세한 블로그 게시물을 작성했습니다.

  2. ==============================

    2.Oliver Gierke의 대답을 확장하기 위해 최신 버전의 Spring Data에서는 응용 프로그램 시작 오류를 방지하기 위해 ReadOnlyRepository (부모 인터페이스)에 @NoRepositoryBean 주석이 필요합니다.

    Oliver Gierke의 대답을 확장하기 위해 최신 버전의 Spring Data에서는 응용 프로그램 시작 오류를 방지하기 위해 ReadOnlyRepository (부모 인터페이스)에 @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. ==============================

    3.문서에서 볼 수있는 한, org.springframework.data.repository.Repository를 구현하면 가능합니다.

    문서에서 볼 수있는 한, org.springframework.data.repository.Repository를 구현하면 가능합니다.

  4. ==============================

    4.나를 위해 다음 일했습니다. 올리버의 솔루션을 사용하여 오류가 발생했습니다. init 메소드의 호출이 실패했습니다. 중첩 예외는 org.springframework.data.mapping.PropertyReferenceException : 시작하는 동안 유형에 대해 findOne 속성을 찾을 수 없습니다.

    나를 위해 다음 일했습니다. 올리버의 솔루션을 사용하여 오류가 발생했습니다. init 메소드의 호출이 실패했습니다. 중첩 예외는 org.springframework.data.mapping.PropertyReferenceException : 시작하는 동안 유형에 대해 findOne 속성을 찾을 수 없습니다.

    @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();
    }
    
  5. from https://stackoverflow.com/questions/11107136/creating-a-read-only-repository-with-springdata by cc-by-sa and MIT license