簡體   English   中英

Spring Data Jpa是否支持存儲庫繼承以及如何做?

[英]Does Spring Data Jpa supports repository inheritance and how to do?

我有一個由以下內容組成的簡單實體繼承樹:

abstract class Item (id, ...)
class Chart extends Item (...)
class Table extends Item (...)

每個類都有自己的存儲庫: ItemRepositoryChartRepositoryTableRepository 這三個存儲庫都已暴露

由於域規則的原因,我需要在刪除時實現自定義邏輯,如下所述: http : //docs.spring.io/spring-data/jpa/docs/1.10.3.RELEASE/reference/html/#repositories.custom -實現

這種自定義刪除邏輯涉及繼承樹中的所有實體(抽象的兩個實體)。

有沒有辦法在ItemRepository上實現自定義邏輯並使ItemRepository的存儲庫擴展ItemRepository

這將避免對繼承樹的每個實體重復相同的邏輯。 沒有這個,就會產生很多樣板類:

EntityRepository + EntityRepositoryCustom + EntityRepositoryImpl x 3 entities = 9 classes僅用於實現要在刪除時執行的1 ligne代碼...

編輯

用戶的答案user7398104讓我上實行事情解釋的方式在這里那里 ,但論文資源沒有解釋如何實現在一個自定義的庫@NoRepositoryBean基礎庫。 我沒有運氣就嘗試了以下方法:

@NoRepositoryBean
public interface ItemBaseRepository<T extends Item> extends 
    CrudRepository<T, Integer>,
    ItemBaseRepositoryCustom<T>

@RepositoryRestResource
public interface ItemRepository extends ItemBaseRepository<Item> {}

@RepositoryRestResource
public interface ChartRepository extends ItemBaseRepository<Item> {}

@RepositoryRestResource
public interface TableRepository extends ItemBaseRepository<Item> {}

public interface ItemBaseRepositoryCustom<T extends Item> {
    public void delete (T i);
}

public class ItemBaseRepositoryImpl<T extends Item>
    implements ItemBaseRepositoryCustom<T> {

    public void delete (T i) {
        // Custom logic
    }

}

編輯編輯

我試圖設置@NoRepositoryBean到ItemBaseRepositoryCustom的意見的建議,但它不工作的。

您可以創建擴展ItemRepository接口的ItemRepositoryCustom接口,每個圖表和表格存儲庫都可以擴展ItemRepositoryCustom存儲庫。 對於此接口,您可以為刪除操作添加自定義實現。

編輯 :我只是意識到這將無法正常工作。

但是以下方法會起作用。

interface CustomItemRepository<T extends Item> extends CrudRepository<T, Long>{ }

interface ChartRepository extends CustomItemRepository<Chart>{ }

interface TableRepository extends CustomItemRepository<Table>{ }

然后,您可以為CustomItemRepository創建用於刪除邏輯的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM