由于項目中的 實體(entity)預設都是繼承一個父類(包含一些公共的屬性,比如建立時間,修改時間,是否删除,主鍵id)。為了實作邏輯删除,一般會自己實作RepositoryFactoryBean 和 Repository。但是由于多個團隊開發的結果,表的結構沒有同一,也就是會出現有的表沒有基礎父類對應的字段,這樣就會導緻自定義的jpa repository操作這些表就會出錯。
預設父類

View Code
自定義Repository接口
添加BaseDao接口
BaseDao繼承了JpaSpecificationExecutor、CrudRepository,這樣可以保證所有Repository都有基本的增删改查以及分頁等方法。
在BaseDao上添加<code>@NoRepositoryBean</code>标注,這樣Spring Data Jpa在啟動時就不會去執行個體化BaseDao這個接口

然後,使所有Repository接口都繼承BaseDao
實作BaseRepository
定義好自定義的方法後,我們現在通過一個基本的Repository類來實作該方法:
首先添加BaseDaoImpl類,繼承SimpleJpaRepository類,使其擁有Jpa Repository的基本方法。
我們發現Repository有兩個構造函數:
SimpleJpaRepository(JpaEntityInformation entityInformation, EntityManager entityManager)
SimpleJpaRepository(Class domainClass, EntityManager em)
這裡我們實作第二個構造函數,拿到<code>domainClass</code>和<code>EntityManager</code>兩個對象。因為我們要實作的是知道某個Repository是否支援某個領域對象的類型,是以在實作構造函數時我們将<code>domainClass</code>的資訊保留下來。

RepositoryFactoryBean 實作
接下來我們來建立一個自定義的BaseDaoFactoryBean來代替預設的<code>RepositoryFactoryBean</code>。<code>RepositoryFactoryBean</code>負責傳回一個<code>RepositoryFactory</code>,Spring Data Jpa 将使用<code>RepositoryFactory</code>來建立Repository具體實作,這裡我們用BaseDaoImpl代替<code>SimpleJpaRepository</code>作為Repository接口的實作。這樣我們就能夠達到為所有Repository添加或修改自定義方法的目的。

jpa 配置檔案
由于有的表沒有預設父類AbsIdEntity對應的字段,導緻生成 Repository 在操作表的時候會報錯。需要修改的就是RepositoryFactoryBean的實作邏輯。對于繼承了AbsIdEntity的實體類,傳回自定義的BaseRepository(也就是BaseDaoImpl),否則就傳回SimpleJpaRepository。注意自定義RepositoryFactoryBean的泛型也做了修改。

至此,完成了适配。