1. 程式人生 > >Springboot應用中@EntityScan和@EnableJpaRepositories的用法

Springboot應用中@EntityScan和@EnableJpaRepositories的用法

Springboot應用開發中使用JPA時,通常在主應用程式所在包或者其子包的某個位置定義我們的EntityRepository,這樣基於Springboot的自動配置,無需額外配置我們定義的EntityRepository即可被發現和使用。但有的時候我們需要定義EntityRepository不在應用程式所在包及其子包,那麼這時候就需要使用@EntityScan@EnableJpaRepositories了。

上面提到的EntityRepository指的是通過類似下面的方式定義的EntityRepository :

@Entity
@Table
(name = "grade") public class Grade { // 省略具體內容 }
@Repository
public interface GradeRepository extends JpaRepository<Grade, Long>, JpaSpecificationExecutor<Grade> {
   // 省略具體內容
}

@EntityScan

@EntityScan用來掃描和發現指定包及其子包中的Entity定義。其用法如下:

@EntityScan(basePackages = {"com.department.entities"
,"come.employee.entities"})

如果多處使用@EntityScan,它們的basePackages集合能覆蓋所有被Repository使用的Entity即可,集合有交集也沒有關係。但是如果不能覆蓋被Repository使用的Entity,應用程式啟動是會出錯,比如:

Not a managed type: com.customer.entities.Customer

@EnableJpaRepositories

@EnableJpaRepositories用來掃描和發現指定包及其子包中的Repository定義。其用法如下:

@EnableJpaRepositories
(basePackages = {"com.department.repositories","come.employee.repositories"})

如果多處使用@EnableJpaRepositories,它們的basePackages集合不能有交集,並且要能覆蓋所有需要的Repository定義。

如果有交集,相應的Repository會被嘗試反覆註冊,從而遇到如下錯誤:

The bean ‘OrderRepository’, defined in xxx, could not be registered. A bean with that name has already been defined in xxx and overriding is disabled.

如果不能覆蓋所有需要的Repository定義,會遇到啟動錯誤:

Parameter 0 of method setCustomerRepository in com.service.CustomerService required a bean of type ‘come.repo.OrderRepository’ that could not be found.