這個問題在當時讓我發瘋,所以我想我可以幫你解決這個問題。
基本上,這個想法是:
- 你的JPA配置創建一個配置類
- 添加@EntityScan和@EnableJpaRepositories引用相同的配置類作爲basePackageClass
- 導入此配置類您的自動配置
- 創建一個註釋,然後您可以在需要的地方重新使用Jpa配置
在您的示例中,您使用Spring應用程序類作爲掃描的基礎。
我已經提出了一個樣本項目在https://github.com/rdlopes/custom-jpa-demo
在這個例子中,以POC的主要思路,還有一個供JPA實體/庫露出了JPA配置一個項目:
@Configuration
@EntityScan(basePackageClasses = JpaConfiguration.class)
@EnableJpaRepositories(basePackageClasses = JpaConfiguration.class,
repositoryBaseClass = BaseRepositoryImpl.class)
public class JpaConfiguration {
}
要小心對於您的存儲庫的常見實現,您需要顯示特殊簽名:
@NoRepositoryBean
public class BaseRepositoryImpl<T, ID extends Serializable>
extends SimpleJpaRepository<T, ID>
implements BaseRepository<T, ID> {
public BaseRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager entityManager) {
super(entityInformation, entityManager);
}
@Override
public String someCustomMethod(ID id) {
return "Class for entity of id " + id + " is: " + getDomainClass().getSimpleName();
}
}
然後,您可以創建自動配置爲s UCH:
@Configuration
@ConditionalOnClass(CustomJpaRepositories.class)
@Import(JpaConfiguration.class)
public class JpaCustomAutoConfiguration {
}
提供了一個註解讓事情變得整潔,在這裏你需要JPA使用它:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface CustomJpaRepositories {
}
使用您的JPA班會具有此註釋,你打電話給你的JPA庫一樣簡單:
@SpringBootApplication
@CustomJpaRepositories
public class CustomJpaSampleApplication {
public static void main(String[] args) {
SpringApplication.run(CustomJpaSampleApplication.class, args);
}
@Bean
public CommandLineRunner dataInitializer(UserRepository userRepository) {
return args -> {
User user1 = new User();
user1.setName("user 1");
userRepository.save(user1);
User user2 = new User();
user2.setName("user 2");
userRepository.save(user2);
userRepository.findAll()
.forEach(user -> System.out.println(
userRepository.someCustomMethod(user.getId())));
};
}
}
希望這有助於你獲得通過的撓頭時刻:-)
我就吃克同樣的問題,仍然在尋找解決方案。不幸的是,rdlopes和dan.jones提供的答案並不能解決問題。 –