,直到春天數據的M2,我們需要用戶擴展JpaRepository
由於以下原因:
- 類路徑掃描基礎設施只能拿起接口擴展爲一個可以使用Spring數據JPA和Spring數據接口並行的Mongo,並且他們都指向同一個軟件包,因此不清楚爲哪個存儲創建代理。然而,自RC1以來,我們只是將這一負擔留給開發人員,因爲我們認爲這是一個相當特殊的情況,只是使用
Repository
,CrudRepository
等的好處超過了您在剛剛描述的角落案例中必須付出的努力。您可以在名稱空間中使用exclude
和include
元素來獲得對此的更精細控制。
- 直到M2爲止,我們通過重新聲明CRUD方法並使用
@Transactional
註釋它們來將事務性應用於CRUD方法。這個決定反過來是由算法AnnotationTransactionAttributeSource
用來查找交易配置。因爲我們希望通過在具體存儲庫接口中重新聲明CRUD方法並在其上應用@Transactional
來爲用戶提供重新配置事務的可能性。對於RC1,我們決定實施一個自定義TransactionAttributeSource
,以便能夠將註釋移回存儲庫CRUD實施。
長話短說,下面是它歸結爲:
由於RC1的就沒有必要再延長儲存庫特定接口,除了要 ...
- 使用
List
基於findAll(…)
的訪問,而不是基於Iterable
的更爲核心的存儲庫接口(儘管您可以簡單地重新聲明通用基接口中的相關方法以返回List
s)
- 您想使用特定於JPA的方法,如
saveAndFlush(…)
等。
從RC1開始,通常您會對CRUD方法的暴露程度更加靈活,因爲您甚至只能擴展標記接口並選擇性地添加要公開的CRUD方法。由於底層實現仍然會實現所有的PagingAndSortingRepository
的方法,我們仍然可以路由實例的電話:
public interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
List<T> findAll();
T findOne(ID id);
}
public interface UserRepository extends MyBaseRepository<User, Long> {
List<T> findByUsername(String username);
}
在那個例子中,我們定義MyBaseRepository
只露出findAll()
和findOne(…)
(將被路由到該實例實施CRUD方法)以及具體的存儲庫爲兩個CRUD添加了查找方法。
有關該主題的更多詳細信息,請查閱reference documentation。
實際上,如果您在接口中知道存儲庫實現是給定類型的,爲什麼要使用接口呢?但我想你喜歡你很難做得更好...... – 2011-05-12 13:13:30
我認爲/期望從RDBMS到面向文檔的商店的變化將需要在對象/域模型上進行重大更改。無論如何,*持久化抽象以某種方式泄漏*。總是。如果可以簡單地從JpaRepository更改爲MongoDBRepository而沒有對領域模型進行重大更改,那麼我會推測領域模型開始時並不複雜。沒有錯,因爲有些應用程序就是這樣。 – 2014-01-28 18:48:24