这个问题当时让我发疯,所以我想我可以帮助你。
基本上,我们的想法是:
- 为 Jpa 配置创建配置类
- 添加@EntityScan和@EnableJpaRepositories引用与 basePackageClass 相同的配置类
- 在自动配置中导入此配置类
- 创建一个注释,然后可以在需要 Jpa 配置的地方重用该注释
在您的示例中,您将 Spring 应用程序类用作扫描的基础。
我已经提出了一个示例项目来POC的主要思想 https://github.com/rdlopes/custom-jpa-demo
在示例中,有一个 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();
}
}
然后,您可以按如下方式创建自动配置:
@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())));
};
}
}
希望这有助于您度过挠头的时刻:-)