Если вы хотите позволить SchemaValidator
повторно использовать конфигурацию соединения и информацию о сопоставлении, которые уже сконфигурированы в проекте, а не определять их еще раз для проверки схемы, вы должны рассмотреть мое решение таким образом, что вы СУХОЙ и донНе нужно поддерживать эти конфигурации в двух разных местах.
На самом деле, SchemaValidator
требует, это экземпляр Metadata
, который доступен только во время начальной загрузки Hibernate.Но мы можем использовать Hibernate Integrator API (как описано в здесь ), чтобы захватить его, чтобы мы могли проверить их позже.
(1) Создать SchemaValidateService
, который реализует Hibernate Integrator API для захватаMetadata
.Также настройте метод @Scheduled
для проверки схемы в нужное время.
@Component
public class SchemaValidateService implements Integrator {
private Metadata metadata;
@Override
public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory,
SessionFactoryServiceRegistry serviceRegistry) {
this.metadata = metadata;
}
@Override
public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
}
//Adjust the scheduled time here
@Scheduled(cron = "0 0/1 * * * ?")
public void validate() {
try {
System.out.println("Start validating schema");
new SchemaValidator().validate(metadata);
} catch (Exception e) {
//log the validation error here.
}
System.out.println("Finish validating schema....");
}
}
(2) Зарегистрируйте SchemaValidateService
в Hibernate
@SpringBootApplication
@EnableScheduling
public class App {
@Bean
public HibernatePropertiesCustomizer hibernatePropertiesCustomizer(SchemaValidateService schemaValidateService) {
return (prop -> {
List<Integrator> integrators = new ArrayList<>();
integrators.add(schemaValidateService);
prop.put("hibernate.integrator_provider", (IntegratorProvider) () -> integrators);
});
}
}
Кроме того, это решение должно иметь лучшую производительностьпоскольку ему не нужно каждый раз создавать новое соединение с базой данных для проверки схемы, поскольку он может просто извлечь соединение из существующего пула соединений.