public class HibernateSpringIntegrator
implements MetadataBuilderInitializer, ApplicationContextAware {
private static ApplicationContext applicationContext;
private static final Logger log = LoggerFactory.getLogger(HibernateSpringIntegrator.class);
@Override
public void contribute(final MetadataBuilder metadataBuilder, final StandardServiceRegistry serviceRegistry) {
log.info("Registering custom SQL functions"); try {
Map<String, HibernateSqlFunctionRegistrar> registars =
HibernateSpringIntegrator.applicationContext.getBeansOfType(HibernateSqlFunctionRegistrar.class);
String dialectClassname =
HibernateSpringIntegrator.applicationContext.getBean("jpaProperties", Properties.class)
.getProperty("hibernate.dialect");
Dialect dialect = (Dialect) Class.forName(dialectClassname).newInstance();
registars.forEach((beanname, registrar) -> {
Class<?> listenerClass = AopUtils.getTargetClass(registrar);
log.debug("Registering: {}", listenerClass); registrar.getSqlFunctions(dialect).forEach((name, sqlFunction) -> {
metadataBuilder.applySqlFunction(name, sqlFunction);
});
});
} catch (RuntimeException e) {
throw e;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}