Spring Data JPA'daki CrudRepository ve JpaRepository arayüzleri arasındaki fark nedir?


Yanıtlar:


958

JpaRepositoryuzanır PagingAndSortingRepositorysırayla uzanan CrudRepository.

Ana işlevleri:

  • CrudRepository temel olarak CRUD işlevleri sağlar.
  • PagingAndSortingRepository sayfalara ayırma ve kayıtları sıralama yöntemleri sunar.
  • JpaRepository kalıcılık bağlamını temizleme ve bir toplu işteki kayıtları silme gibi JPA ile ilgili bazı yöntemler sağlar.

Devralma yukarıda belirtilen Çünkü JpaRepositorybütün fonksiyonlarını sahip olacak CrudRepositoryve PagingAndSortingRepository. Bu nedenle, JpaRepositoryve tarafından sağlanan işlevlere sahip olmak için depoya ihtiyacınız yoksa PagingAndSortingRepositorykullanın CrudRepository.


144
ve findAll () :-) içinde Yinelenebilir <> yerine <> Listesi döndürür
Hinotori

397

Ken'in cevabı temelde doğru ama "neden birini diğerinin üzerinde kullanmak istesin?" sorunuzun bir parçası.

temeller

Deponuz için seçtiğiniz temel arabirimin iki ana amacı vardır. İlk olarak, Spring Data veri havuzu altyapısının arayüzünüzü bulmasına ve proxy oluşturmayı tetiklemesine izin vererek arayüzün örneklerini istemcilere enjekte edebilirsiniz. İkinci amaç, ekstra yöntemler bildirmek zorunda kalmadan arayüze ihtiyaç duyulduğu kadar işlevsellik kazandırmaktır.

Ortak arayüzler

Spring Data çekirdek kütüphanesi, özel bir işlevler dizisi ortaya çıkaran iki temel arayüzle birlikte gönderilir:

  • CrudRepository - CRUD yöntemleri
  • PagingAndSortingRepository- sayfalama ve sıralama yöntemleri (genişletilir CrudRepository)

Mağazaya özel arayüzler

Bireysel mağaza modülleri (örn. JPA veya MongoDB için), bu mağaza arayüzlerinin mağazaya özgü uzantılarını, bazı mağaza özelliklerini dikkate alan yıkama veya özel yığınlama gibi mağazaya özgü işlevselliğe erişim sağlamak için ortaya çıkarır. Bunun bir örneği, deleteInBatch(…)içinde JpaRepositoryfarklı olan delete(…)daha ölçülebilir, ancak (özel tanımlamaktan gibi) JPA tanımlı kaskadlarını tetiklemediğini yan etkisi ile birlikte verilen varlıkları silmek için bir sorgu kullanır.

Genellikle tavsiye ediyoruz değil onlar müşterilerine yatan kalıcılık teknolojisini maruz bırakılması ve böylece onları ve depo arasındaki bağlantı sıkın olarak bu baz arayüzleri kullanın. Ayrıca, temel olarak "varlık koleksiyonu" olan bir deponun orijinal tanımından biraz uzaklaşırsınız. Yani eğer yapabilirsenPagingAndSortingRepository .

Özel depo tabanı arabirimleri

Sağlanan temel arayüzlerden birine doğrudan bağlı olmanın dezavantajı iki katlıdır. Her ikisi de teorik olarak kabul edilebilir, ancak bence bunların farkında olmaları önemlidir:

  1. Bir Spring Data veri havuzu arayüzüne bağlı olarak veri havuzu arayüzünüzü kütüphaneye bağlar. Bunun özel bir sorun olduğunu düşünmüyorum çünkü muhtemelenPage veya Pageablekodunuzda . Spring Data, commons-lang veya Guava gibi diğer genel amaçlı kitaplıklardan farklı değildir. Makul yarar sağladığı sürece, gayet iyi.
  2. Örneğin CrudRepository, bir kerede eksiksiz bir kalıcılık yöntemi setini açığa çıkarırsınız. Bu muhtemelen çoğu durumda da iyidir, ancak maruz kalan yöntemler üzerinde daha hassas bir kontrol elde etmek istediğiniz durumlarla karşılaşabilirsiniz, örneğin ve yöntemlerini ReadOnlyRepositoryiçermeyen bir tane oluşturmak için .save(…)delete(…)CrudRepository

Bu dezavantajların her ikisinin de çözümü, kendi temel veri havuzu arayüzünüzü ve hatta bir dizi oluşturmaktır. Birçok uygulamada böyle bir şey gördüm:

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

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

  // Al finder methods go here
}

İlk depo arabirimi, aslında yalnızca 1. noktayı sabitleyen, aynı zamanda kimlik türünü Longtutarlılık için bağlayan bazı genel amaçlı temel arabirimdir . İkinci arayüz genellikle hepsi var find…(…)kopyalanan yöntemleri CrudRepositoryve PagingAndSortingRepositoryancak manipüle olanları göstermiyor. Referans yaklaşımı içinde bu yaklaşım hakkında daha fazla bilgi edinin .

Özet - tl; dr

Havuz soyutlama tamamen mimari ve fonksiyonel ihtiyaçlarınız tarafından yönlendirilen temel havuzu seçmenizi sağlar. Uygunsa kutudan çıkanları kullanın, gerekirse kendi havuz tabanı arayüzlerinizi oluşturun. Kaçınılmaz olmadıkça mağazaya özel depo arayüzlerinden uzak durun.


84

resim açıklamasını buraya girin

Özet:

  • PagingAndSortingRepository, CrudRepository'yi genişletir

  • JpaRepository, PagingAndSortingRepository'yi genişletir

CrudRepository o kendi yöntemlerini tanımlamak zorunda kalmadan, güncelleme ve silme kayıtları oluşturmak okumanızı sağlar, böylece arayüz, CRUD işlemleri için yöntemler sağlar.

PagingAndSortingRepository varlıkları Sayfalandırma kullanarak ve sıralama almak için ek yöntemler sağlar.

Son olarak JpaRepository , JPA'ya özgü bazı işlevler ekler.


"Deposu <>" genişletirse ne olur? Hangi yöntemlere sahip olacak? CrudRepository ile aynı mı?
s-kaczmarek

16

Bahar Verileri JPA'sını öğreniyorum. Size yardımcı olabilir: resim açıklamasını buraya girin


3

Tüm cevaplar soruya yeterli ayrıntılar sağlar. Ancak, bir şey daha ekleyeyim.

Neden bu arayüzleri kullanıyoruz:

  • Spring'in depo arayüzlerinizi bulmasına ve onlar için proxy nesneleri oluşturmasına izin verir.
  • Size bazı ortak işlemleri gerçekleştirmenizi sağlayan yöntemler sağlar (özel yönteminizi de tanımlayabilirsiniz). Ben basit bir işlem yapmak için bir yöntem (ve sorgu ve hazırlanan ifadeler tanımlamak ve daha sonra bağlantı nesnesi ile sorgu yürütmek) oluşturma çünkü bu özelliği seviyorum gerçekten berbat!

Hangi arayüz ne yapar:

  • CrudRepository : CRUD işlevleri sağlar
  • PagingAndSortingRepository : sayfalandırma ve kayıtları sıralama yöntemleri sağlar
  • JpaRepository : kalıcılık bağlamını temizleme ve toplu işteki kayıtları silme gibi JPA ile ilgili yöntemler sağlar

Hangi arayüz ne zaman kullanılır?

Göre http://jtuts.com/2014/08/26/difference-between-crudrepository-and-jparepository-in-spring-data-jpa/

Genellikle en iyi fikir, sıralama ve sayfalamaya ihtiyacınız olup olmadığına bağlı olarak CrudRepository veya PagingAndSortingRepository'yi kullanmaktır .

JpaRepository mümkünse JPA kalıcılık teknolojisi depoları bağlar çünkü kaçınılmalıdır, ve çoğu durumda muhtemelen hatta onun tarafından sağlanan ekstra yöntemleri kullanmak olmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.