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 JpaRepository
farklı 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:
- 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ü muhtemelen
Page
veya Pageable
kodunuzda . 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.
- Ö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 ReadOnlyRepository
iç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ü Long
tutarlılık için bağlayan bazı genel amaçlı temel arabirimdir . İkinci arayüz genellikle hepsi var find…(…)
kopyalanan yöntemleri CrudRepository
ve PagingAndSortingRepository
ancak 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.