2017-02-20 95 views
1

假設我有一個實體,稱爲Product。我設計的回購爲添加自定義方法JPARepository與泛型

@Repository 
interface ProductRepository implements JPARepository<Product, Integer>{} 

這將繼承所有的默認方法,如save, findAll等;

現在我想有一個自定義的方法,這也是其他實體的常用方法。我又增加了接口和實現

interface CustomRepository<T,ID>{ public void customMethod() } 
class CustomRepositoryImpl implements CustomRepository<T,ID>{ public void customMethod(){} } 

我重寫ProductRepository作爲

@Repository 
interface ProductRepository implements 
JPARepository<Product, Integer>, 
CustomRepository<Product, Integer> 
{} 

現在,這並沒有給我任何編譯錯誤。但在運行期間,我得到這個錯誤:

No property 'customMethod' is found for Product

我在想什麼?

回答

3

你似乎在試圖自定義行爲添加到一個庫,即ProductRepository。但是,代碼的結構就好像自定義行爲需要添加到所有存儲庫(CustomRepository不是特定於Product)。因此,錯誤。


Step 1: Declare a custom repository

interface CustomRepository<T, ID extends Serializable> { 
    void customMethod(); 
} 

Step 2: Add custom behaviour to the required repository

interface ProductRepository extends CrudRepository<Product, Integer> 
            , CustomRepository<Product, Integer> {} 

Step 3: Add a Product specific implementation

class ProductRepositoryImpl implements CustomRepository<Product, Integer> { ... } 

:類必須被命名爲ProductRepositoryImpl春季數據JPA水暖自動把它撿起來。


工作示例,請on Github


如果你寧願添加自定義行爲的所有庫,請參閱relevant section官方文檔。

+0

感謝您的代碼鏈接。什麼是班級「模特」。班級的定義是什麼?此外,ProductrepositoryImpl應該實現ProductRepository,否則spring將不會創建實例 – madhairsilence

+0

所有代碼都包含在示例中。將集成測試作爲'mvn test'運行。 – manish

+0

好的。模型@MappedSuperClass在這裏是新的。但是,再次。我可以看到customMethod在ProductRepositoryImpl中實現。這將使其僅適用於產品。如果我有新的實體稱爲服務。我將再次必須編寫相同的代碼「同上」。我如何將實現移動到泛型類 – madhairsilence

0

確定。這是針對那些試圖在SpringBoot應用程序

中遵循@manish發佈的任何內容的人的。在這裏工作的代碼Working Code

你一定要做出一個小的變化。 定義Model類爲

@MappedSuperclass 
@IdClass(ModelID.class) 
public abstract class Model implements Serializable 

定義ID類作爲

public class ModelID implements Serializable{ 

    @Column(name = "id") 
    @Generated(GenerationTime.INSERT) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Id 

    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 



} 

這讓我的工作!