Springboot應用中@EntityScan和@EnableJpaRepositories的用法
在Springboot
應用開發中使用JPA
時,通常在主應用程式所在包或者其子包的某個位置定義我們的Entity
和Repository
,這樣基於Springboot
的自動配置,無需額外配置我們定義的Entity
和Repository
即可被發現和使用。但有的時候我們需要定義Entity
和Repository
不在應用程式所在包及其子包,那麼這時候就需要使用@EntityScan
和@EnableJpaRepositories
了。
上面提到的
Entity
和Repository
指的是通過類似下面的方式定義的Entity
和Repository
:
@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.