2014-04-04 26 views
10

我使用的是彈簧數據的JPA的CrudRepository只是定義實體的接口,然後讓所有的標準CRUD方法,而不必明確提供一個實現,如:如何在Spring中只實現CrudRepository的特定方法?

public interface UserRepo extends CrudRepository<User, Long> { 

} 

雖然現在我想喜歡在我的自定義實現中僅覆蓋save()方法。我怎麼能做到這一點?因爲,如果我實現了接口UserRepo,我必須實現從接口CrudRepository繼承的所有其他CRUD方法。

我不能編寫自己的實現,它具有所有的CRUD方法,但是隻覆蓋一個,而不必自己實現所有其他實現?

回答

12

你可以做一些事情非常相似,我相信會達到你要找的結果。

必要步驟:

1)UserRepo現在將延長2個接口:

public interface UserRepo extends CrudRepository<User, Long>, UserCustomMethods{ 

} 

2)創建一個名爲UserCustomMethods(你可以選擇的名稱新的界面和在這裏和在步驟1中改變)

public interface UserCustomMethods{ 
    public void mySave(User... users); 

} 

3)創建一個名爲新類(這裏的名稱確實是的問題,它應該是RepositoryName Impl,因爲如果你把它叫做別的東西,你將需要相應地調整Java/XML配置)。此類應僅實現您創建的界面。

提示:您可以在這個類注入的EntityManager爲您查詢

public class UserRepoImpl implements UserCustomMethods{ 

    //This is my tip, but not a must... 
    @PersistenceContext 
    private EntityManager em; 

    public void mySave(User... users){ 
     //do what you need here 
    } 
} 

4)注入UserRepo只要您需要,並同時享受CRUD和您的自定義方法:)

+0

所以爲了我只需要聲明/實現UserCustomMethods/UserRepoImpl?中的save方法就可以覆蓋save方法。你在這裏給出的例子顯示了一個額外的方法,但這是否也適用於現有的方法? – coderatchet

+0

是的,您可以添加方法到您的自定義界面,使用默認方法的相同簽名,您可以在實現自定義界面的Impl類中實現它們:以這種方式,Spring Data將使用您的自定義實現,而不是默認的一個。至少這對我來說適用於Spring Data JPA 1.7.2中的刪除方法。 –

+0

如何在UserRepoImpl :)中使用UserRepo的非自定義方法(由spring數據自動提供)? – bodrin

相關問題