3 回答

TA貢獻2041條經驗 獲得超4個贊
Ken的回答基本上是正確的,但我想提一下“您為什么要在另一個上使用一個?” 您的問題的一部分。
基本
您為存儲庫選擇的基本接口有兩個主要目的。首先,您允許Spring Data存儲庫基礎結構找到您的接口并觸發代理創建,以便將接口實例注入客戶端。第二個目的是在接口中引入所需的功能,而不必聲明其他方法。
通用接口
Spring Data核心庫附帶兩個基本接口,它們公開了一組專用功能:
CrudRepository -CRUD方法
PagingAndSortingRepository-分頁和排序方法(擴展CrudRepository)
商店特定的界面
各個商店模塊(例如,針對JPA或MongoDB的商店模塊)公開了這些基本接口的特定于商店的擴展,以允許訪問特定于商店的功能(例如沖洗或專用批處理),這些功能考慮了一些特定于商店的情況。這方面deleteInBatch(…)的一個示例與之JpaRepository不同,delete(…)因為它使用查詢來刪除給定的實體,該實體的性能更高,但具有不觸發JPA定義的級聯(如規范定義)的副作用。
我們通常建議不要使用這些基本接口,因為它們會將底層的持久性技術公開給客戶端,從而加強了它們與存儲庫之間的耦合。另外,您與存儲庫的原始定義有所不同,該存儲庫基本上是“實體集合”。因此,如果可以,請繼續PagingAndSortingRepository。
自定義存儲庫基礎接口
直接取決于所提供的基本接口之一的缺點是雙重的。他們都可以被認為是理論上的,但是我認為重要的是要意識到:
取決于Spring Data存儲庫接口,可將您的存儲庫接口耦合到庫。我認為這不是一個特別的問題,因為您可能仍會在代碼中使用Page或之類的抽象Pageable。Spring Data與其他通用庫(如commons-lang或Guava)沒有任何不同。只要提供合理的利益,就可以了。
通過擴展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,而且將ID類型綁定Long為保持一致性。第二個接口通常具有find…(…)從中復制的所有方法CrudRepository,PagingAndSortingRepository但沒有公開操作方法。在參考文檔中閱讀有關該方法的更多信息。
存儲庫抽象使您可以選擇完全由架構和功能需求驅動的基礎存儲庫。如果適合,請使用開箱即用的提供的接口,并在必要時制作自己的存儲庫基礎接口。除非不可避免,否則請遠離商店特定的存儲庫接口。
添加回答
舉報