in grails-datastore-gorm-hibernate/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java [202:291]
public SessionFactory buildSessionFactory() throws HibernateException {
// set the class loader to load Groovy classes
// work around for HHH-2624
SessionFactory sessionFactory;
Object classLoaderObject = getProperties().get(AvailableSettings.CLASSLOADERS);
ClassLoader appClassLoader;
if(classLoaderObject instanceof ClassLoader) {
appClassLoader = (ClassLoader) classLoaderObject;
}
else {
appClassLoader = getClass().getClassLoader();
}
ConfigurationHelper.resolvePlaceHolders(getProperties());
final GrailsDomainBinder domainBinder = new GrailsDomainBinder(
dataSourceName,
sessionFactoryBeanName,
hibernateMappingContext
);
List<Class> annotatedClasses = new ArrayList<>();
for (PersistentEntity persistentEntity : hibernateMappingContext.getPersistentEntities()) {
Class javaClass = persistentEntity.getJavaClass();
if(javaClass.isAnnotationPresent(Entity.class)) {
annotatedClasses.add(javaClass);
}
}
if(!additionalClasses.isEmpty()) {
for (Class additionalClass : additionalClasses) {
if(GormEntity.class.isAssignableFrom(additionalClass)) {
hibernateMappingContext.addPersistentEntity(additionalClass);
}
}
}
addAnnotatedClasses( annotatedClasses.toArray(new Class[annotatedClasses.size()]));
ClassLoaderService classLoaderService = new ClassLoaderServiceImpl(appClassLoader) {
@Override
public <S> Collection<S> loadJavaServices(Class<S> serviceContract) {
if(MetadataContributor.class.isAssignableFrom(serviceContract)) {
if(metadataContributor != null) {
return (Collection<S>) Arrays.asList(domainBinder, metadataContributor);
}
else {
return Collections.singletonList((S) domainBinder);
}
}
else {
return super.loadJavaServices(serviceContract);
}
}
};
EventListenerIntegrator eventListenerIntegrator = new EventListenerIntegrator(hibernateEventListeners, eventListeners);
BootstrapServiceRegistry bootstrapServiceRegistry = createBootstrapServiceRegistryBuilder()
.applyIntegrator(eventListenerIntegrator)
.applyIntegrator(new MetadataIntegrator())
.applyClassLoaderService(classLoaderService)
.build();
StrategySelector strategySelector = bootstrapServiceRegistry.getService(StrategySelector.class);
strategySelector.registerStrategyImplementor(
PropertyAccessStrategy.class, "traitProperty", TraitPropertyAccessStrategy.class
);
setSessionFactoryObserver(new SessionFactoryObserver() {
private static final long serialVersionUID = 1;
public void sessionFactoryCreated(SessionFactory factory) {}
public void sessionFactoryClosed(SessionFactory factory) {
if (serviceRegistry != null) {
((ServiceRegistryImplementor)serviceRegistry).destroy();
}
}
});
StandardServiceRegistryBuilder standardServiceRegistryBuilder = createStandardServiceRegistryBuilder(bootstrapServiceRegistry)
.applySettings(getProperties());
StandardServiceRegistry serviceRegistry = standardServiceRegistryBuilder.build();
sessionFactory = super.buildSessionFactory(serviceRegistry);
this.serviceRegistry = serviceRegistry;
return sessionFactory;
}