Spring Data JPA 에서 CrudRepository 와 JpaRepository 인터페이스 의 차이점은 무엇입니까 ?
웹에서 예제를 볼 때 상호 교환이 가능하다는 것을 알았습니다.
그들 사이의 차이점은 무엇입니까?
왜 다른 것을 사용하고 싶습니까?
Spring Data JPA 에서 CrudRepository 와 JpaRepository 인터페이스 의 차이점은 무엇입니까 ?
웹에서 예제를 볼 때 상호 교환이 가능하다는 것을 알았습니다.
그들 사이의 차이점은 무엇입니까?
왜 다른 것을 사용하고 싶습니까?
답변:
JpaRepository
확장 PagingAndSortingRepository
차례로 확장 한 CrudRepository
.
주요 기능은 다음과 같습니다.
CrudRepository
주로 CRUD 기능을 제공합니다.PagingAndSortingRepository
페이지 매김 및 정렬 레코드를 수행하는 방법을 제공합니다.JpaRepository
지속성 컨텍스트 플러시 및 배치에서 레코드 삭제와 같은 일부 JPA 관련 방법을 제공합니다.상속의 위에서 언급 한 때문에 JpaRepository
모두의 기능을해야합니다 CrudRepository
및 PagingAndSortingRepository
. 따라서 JpaRepository
및 PagingAndSortingRepository
에서 제공하는 기능을 보유하기 위해 저장소가 필요하지 않은 경우을 사용하십시오 CrudRepository
.
켄의 대답은 기본적으로 옳지 만 "왜 다른 것을 사용하고 싶습니까?" 당신의 질문의 일부.
저장소에 대해 선택한 기본 인터페이스에는 두 가지 주요 목적이 있습니다. 먼저, 스프링 데이터 저장소 인프라가 인터페이스를 찾고 프록시 작성을 트리거하여 인터페이스 인스턴스를 클라이언트에 주입 할 수 있도록합니다. 두 번째 목적은 추가 메소드를 선언하지 않고 인터페이스에 필요한만큼 많은 기능을 도입하는 것입니다.
Spring Data 코어 라이브러리에는 전용 기능 세트를 제공하는 두 가지 기본 인터페이스가 제공됩니다.
CrudRepository
-CRUD 방법PagingAndSortingRepository
-페이지 매김 및 정렬 방법 (확장자 CrudRepository
)개별 상점 모듈 (예 : JPA 또는 MongoDB)은 이러한 기본 인터페이스의 상점 특정 확장을 노출하여 일부 상점 특정을 고려하는 플러싱 또는 전용 배치와 같은 상점 특정 기능에 액세스 할 수 있습니다. 이에 대한 예는 다음 deleteInBatch(…)
의 JpaRepository
다른 어떤 delete(…)
더 확대됨이지만 (사양 정의 그것과 같은) JPA 정의 캐스케이드를 유발하지 않는 부작용 붙어 지정된 엔티티를 삭제 쿼리를 사용한다.
일반적으로 이러한 기본 인터페이스는 기본 지속성 기술을 클라이언트에 노출시켜 해당 인터페이스와 저장소 간의 연결을 강화하므로 사용 하지 않는 것이 좋습니다 . 또한 기본적으로 "엔터티 모음"인 리포지토리의 원래 정의에서 약간 벗어납니다. 따라서 가능하다면로 유지하십시오 PagingAndSortingRepository
.
제공된 기본 인터페이스 중 하나에 직접 의존하는 단점은 두 가지입니다. 둘 다 이론적으로 간주 될 수 있지만 다음 사항을 알고 있어야합니다.
Page
또는 Pageable
코드에서 추상화를 사용할 수 있기 때문에 이것이 특별한 문제라고 생각하지 않습니다 . Spring Data는 commons-lang 또는 Guava와 같은 다른 범용 라이브러리와 다르지 않습니다. 합리적인 이익을 제공하는 한 괜찮습니다.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
하지만, 조작하는 사람을 노출하지 않습니다. 이 방법에 대한 자세한 내용은 참조 설명서를 참조하십시오 .
리포지토리 추상화를 사용하면 아키텍처 및 기능 요구에 따라 완전히 구동되는 기본 리포지토리를 선택할 수 있습니다. 적합한 경우 기본 제공되는 것을 사용하고 필요한 경우 자체 저장소 기본 인터페이스를 작성하십시오. 피할 수없는 경우를 제외하고 상점 특정 저장소 인터페이스에서 멀리 떨어지십시오.
요약:
CagingRepository를 확장하는 PagingAndSortingRepository
JpaRepository는 PagingAndSortingRepository를 확장합니다
CrudRepository 당신이 당신의 자신의 방법을 정의 할 필요없이, 갱신 및 삭제 기록을 작성 읽을 수 있도록 인터페이스는 CRUD 작업을위한 방법을 제공합니다.
PagingAndSortingRepository는 엔티티 페이지 매김을 사용하여 정렬을 검색하는 추가 방법을 제공합니다.
마지막으로 JpaRepository 는 JPA에 특정한 기능을 추가합니다.
모든 답변은 질문에 대한 자세한 정보를 제공합니다. 그러나 더 많은 것을 추가하겠습니다.
왜 우리는 이러한 인터페이스를 사용합니까?
어떤 인터페이스가 무엇을 수행합니까?
어떤 인터페이스를 사용하는 경우 :
http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/ 에 따르면
일반적으로 가장 좋은 방법은 정렬 및 페이징이 필요한지 여부에 따라 CrudRepository 또는 PagingAndSortingRepository 를 사용 하는 것입니다.
JpaRepository는 가능하면 당신은 JPA 지속성 기술에 레포지토리 묶어 때문에 피해야한다, 대부분의 경우에 당신은 아마 그것에서 제공하는 별도의 방법을 사용하지 않을 것입니다.