Spring Data JPA에서 CrudRepository와 JpaRepository 인터페이스의 차이점은 무엇입니까?


답변:


955

JpaRepository확장 PagingAndSortingRepository차례로 확장 한 CrudRepository.

주요 기능은 다음과 같습니다.

  • CrudRepository 주로 CRUD 기능을 제공합니다.
  • PagingAndSortingRepository 페이지 매김 및 정렬 레코드를 수행하는 방법을 제공합니다.
  • JpaRepository 지속성 컨텍스트 플러시 및 배치에서 레코드 삭제와 같은 일부 JPA 관련 방법을 제공합니다.

상속의 위에서 언급 한 때문에 JpaRepository모두의 기능을해야합니다 CrudRepositoryPagingAndSortingRepository. 따라서 JpaRepositoryPagingAndSortingRepository에서 제공하는 기능을 보유하기 위해 저장소가 필요하지 않은 경우을 사용하십시오 CrudRepository.


142
findAll () :-)에서 Iterable <> 대신 List <>를 반환합니다.
Hinotori

397

켄의 대답은 기본적으로 옳지 만 "왜 다른 것을 사용하고 싶습니까?" 당신의 질문의 일부.

기초

저장소에 대해 선택한 기본 인터페이스에는 두 가지 주요 목적이 있습니다. 먼저, 스프링 데이터 저장소 인프라가 인터페이스를 찾고 프록시 작성을 트리거하여 인터페이스 인스턴스를 클라이언트에 주입 할 수 있도록합니다. 두 번째 목적은 추가 메소드를 선언하지 않고 인터페이스에 필요한만큼 많은 기능을 도입하는 것입니다.

공통 인터페이스

Spring Data 코어 라이브러리에는 전용 기능 세트를 제공하는 두 가지 기본 인터페이스가 제공됩니다.

  • CrudRepository -CRUD 방법
  • PagingAndSortingRepository-페이지 매김 및 정렬 방법 (확장자 CrudRepository)

상점 별 인터페이스

개별 상점 모듈 (예 : JPA 또는 MongoDB)은 이러한 기본 인터페이스의 상점 특정 확장을 노출하여 일부 상점 특정을 고려하는 플러싱 또는 전용 배치와 같은 상점 특정 기능에 액세스 할 수 있습니다. 이에 대한 예는 다음 deleteInBatch(…)JpaRepository다른 어떤 delete(…)더 확대됨이지만 (사양 정의 그것과 같은) JPA 정의 캐스케이드를 유발하지 않는 부작용 붙어 지정된 엔티티를 삭제 쿼리를 사용한다.

일반적으로 이러한 기본 인터페이스는 기본 지속성 기술을 클라이언트에 노출시켜 해당 인터페이스와 저장소 간의 연결을 강화하므로 사용 하지 않는 것이 좋습니다 . 또한 기본적으로 "엔터티 모음"인 리포지토리의 원래 정의에서 약간 벗어납니다. 따라서 가능하다면로 유지하십시오 PagingAndSortingRepository.

사용자 정의 저장소 기본 인터페이스

제공된 기본 인터페이스 중 하나에 직접 의존하는 단점은 두 가지입니다. 둘 다 이론적으로 간주 될 수 있지만 다음 사항을 알고 있어야합니다.

  1. Spring Data 리포지토리 인터페이스에 따라 리포지토리 인터페이스가 라이브러리에 연결됩니다. 어쨌든 코드에서 Page또는 Pageable코드에서 추상화를 사용할 수 있기 때문에 이것이 특별한 문제라고 생각하지 않습니다 . Spring Data는 commons-lang 또는 Guava와 같은 다른 범용 라이브러리와 다르지 않습니다. 합리적인 이익을 제공하는 한 괜찮습니다.
  2. eg를 확장 CrudRepository하면 전체 지속성 방법을 한 번에 노출 할 수 있습니다. 아마도 대부분의 상황에서도 문제가되지 않지만 메소드 노출에 대한보다 세밀한 제어를 원하는 상황에 처할 수 있습니다 (예 : 및 메소드를 ReadOnlyRepository포함하지 않는 메소드 작성) .save(…)delete(…)CrudRepository

이 두 가지 단점에 대한 해결책은 자신의 기본 리포지토리 인터페이스 또는 심지어 그 세트를 만드는 것입니다. 많은 응용 프로그램에서 다음과 같은 것을 보았습니다.

interface ApplicationRepository<T> extends PagingAndSortingRepository<T, Long> { }

interface ReadOnlyRepository<T> extends Repository<T, Long> {

  // Al finder methods go here
}

첫 번째 저장소 인터페이스는 실제로 포인트 1 만 수정 Long하고 일관성을 위해 ID 유형을 연결하는 범용 기본 인터페이스입니다 . 두 번째 인터페이스는 일반적으로 모든이 find…(…)복사 방법 CrudRepository등을 PagingAndSortingRepository하지만, 조작하는 사람을 노출하지 않습니다. 이 방법에 대한 자세한 내용은 참조 설명서를 참조하십시오 .

요약-tl; dr

리포지토리 추상화를 사용하면 아키텍처 및 기능 요구에 따라 완전히 구동되는 기본 리포지토리를 선택할 수 있습니다. 적합한 경우 기본 제공되는 것을 사용하고 필요한 경우 자체 저장소 기본 인터페이스를 작성하십시오. 피할 수없는 경우를 제외하고 상점 특정 저장소 인터페이스에서 멀리 떨어지십시오.


84

여기에 이미지 설명을 입력하십시오

요약:

  • CagingRepository를 확장하는 PagingAndSortingRepository

  • JpaRepository는 PagingAndSortingRepository를 확장합니다

CrudRepository 당신이 당신의 자신의 방법을 정의 할 필요없이, 갱신 및 삭제 기록을 작성 읽을 수 있도록 인터페이스는 CRUD 작업을위한 방법을 제공합니다.

PagingAndSortingRepository는 엔티티 페이지 매김을 사용하여 정렬을 검색하는 추가 방법을 제공합니다.

마지막으로 JpaRepository 는 JPA에 특정한 기능을 추가합니다.


"확장 저장소 <>"는 어떻습니까? 어떤 방법이 있습니까? CrudRepository와 동일합니까?
s-kaczmarek

15

Spring Data JPA를 배우고 있습니다. 도움이 될 수 있습니다. 여기에 이미지 설명을 입력하십시오


3

모든 답변은 질문에 대한 자세한 정보를 제공합니다. 그러나 더 많은 것을 추가하겠습니다.

왜 우리는 이러한 인터페이스를 사용합니까?

  • 이것들은 Spring이 당신의 저장소 인터페이스를 찾고 그것들을위한 프록시 객체를 생성하게한다.
  • 일반적인 작업을 수행 할 수있는 방법을 제공합니다 (사용자 정의 방법도 정의 할 수 있음). 간단한 작업을 수행하는 메서드를 만들고 쿼리 및 준비된 문을 정의한 다음 연결 개체로 쿼리를 실행하기 때문에이 기능이 마음에 듭니다.

어떤 인터페이스가 무엇을 수행합니까?

  • CrudRepository : CRUD 기능 제공
  • PagingAndSortingRepository : 페이지 매김 및 정렬을 수행하는 메소드 제공
  • JpaRepository : 지속성 컨텍스트 플러시 및 배치에서 레코드 삭제와 같은 JPA 관련 메소드를 제공합니다.

어떤 인터페이스를 사용하는 경우 :

http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/ 에 따르면

일반적으로 가장 좋은 방법은 정렬 및 페이징이 필요한지 여부에 따라 CrudRepository 또는 PagingAndSortingRepository 를 사용 하는 것입니다.

JpaRepository는 가능하면 당신은 JPA 지속성 기술에 레포지토리 묶어 때문에 피해야한다, 대부분의 경우에 당신은 아마 그것에서 제공하는 별도의 방법을 사용하지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.