Spring Hibernation: Remapping Entities

in a web application we use Spring 3.2 and Hibernate 4.1.1 and implement a plugin-like architecture. Plugins can be added and removed at runtime. For each module, we defined a separate class loader and created a separate child application context for spring. The full configuration is done using annotations, without XML configuration for beans.

Spring Hibernate Configuration Class

@Configuration
@EnableTransactionManagement
public class HibernateConfigurationFactory {

@Bean
public JndiObjectFactoryBean dataSource() {
    JndiObjectFactoryBean ds = new JndiObjectFactoryBean();
    ds.setJndiName("java:jboss/datasources/OurOwnDS");
    ds.setResourceRef(true);
    return ds;
}

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
    sessionFactory.setPackagesToScan("com.foo.bar");
    sessionFactory.setDataSource((DataSource) dataSource().getObject());

    Properties hibernateProperties = new Properties();
    hibernateProperties.put("hibernate.hbm2ddl.auto", "update");

    sessionFactory.setHibernateProperties(hibernateProperties);

    return sessionFactory;
}

@Bean
public HibernateTransactionManager transactionManager() {
    HibernateTransactionManager transactionManager = new HibernateTransactionManager();
    transactionManager.setSessionFactory(sessionFactory().getObject());
    return transactionManager;
}

}

Now the problem: Some plugins contain their own entities (+ DAO), which are added along with the module at runtime.

Is it possible to create some kind of separate context in hibernate (as we do it in spring) or even add / reload additional entity classes?

EntityManager ? ?

.

Update: ( .. ).

DataSource + SessionFactory + TransactionManager / ApplicationContext. scann factory

LocalSessionFactorybean#setAnnotatedClasses(...)

... ...

: ClassNotFoundException, , , . Hibernate pluginClassloader.

- , Hibernate?

+4
2

, - .

, :

  • ApplicationContext
  • Resource-Loader
  • factory

        // create the datasource bean
        BeanDefinitionBuilder dataSourceBeanBuilder = BeanDefinitionBuilder.rootBeanDefinition(DataSourceConfiguration.class, "createDataSource");
        dataSourceBeanBuilder.addConstructorArgValue(descriptor.getDataSourceDescriptor().getJNDILookupName());
        dataSourceBeanBuilder.addConstructorArgValue(descriptor.getDataSourceDescriptor().isResourceRef());
        moduleContext.registerBeanDefinition("dataSource", dataSourceBeanBuilder.getBeanDefinition());
    
        // now build the sessionFactor
        BeanDefinitionBuilder sessionFactoryBeanBuilder = BeanDefinitionBuilder.rootBeanDefinition(SessionFactoryFactory.class, "createSessionFactory");
        sessionFactoryBeanBuilder.addConstructorArgReference("dataSource");
        sessionFactoryBeanBuilder.addConstructorArgValue(module.getKey());
        sessionFactoryBeanBuilder.addConstructorArgValue(moduleContext.getModuleResourceLoader());
        sessionFactoryBeanBuilder.addConstructorArgValue(annotatedClasses);
        moduleContext.registerBeanDefinition("sessionFactory", sessionFactoryBeanBuilder.getBeanDefinition());
    
        // now build the transactionManager
        BeanDefinitionBuilder transactionManagerBeanBuilder = BeanDefinitionBuilder.rootBeanDefinition(HibernateConfigurationFactory.class, "createTransactionManager");
        transactionManagerBeanBuilder.addConstructorArgReference("sessionFactory");
        moduleContext.registerBeanDefinition("transactionManager", transactionManagerBeanBuilder.getBeanDefinition());
    
    • context.refresh()
    • context.start()
0

Environment Hibernate?

@Configuration
@EnableTransactionManagement
public class HibernateConfigurationFactory {

    @Autowired
    Environment env;

    @Bean 
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setPackagesToScan("com.foo.bar");
        if (env.containsProperty("some.extra.classes.property") {
            sessionFactory.setAnnotatedClasses(some extrapolation here);
            // Or similarly add extra packages for scanning
            ...
        }
    }
}

DAO beans, @Profile - Spring 4 - @Conditional.

Environment - , , " ". .

- Spring, IoC. SpringSource. , Spring 3.1, .

- , :

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
ConfigurableEnvironment environment = context.getEnvironment();

// this is how you set different properties per a sub context. 
Map subContextMap = new HashMap();
subContextMap.put("some.extra.classes.property", [unique value here]);
environment.getPropertySources().addFirst(new MapPropertySource("SUB_CTX_MAP", subContextMap);

// this is the generic configuration class(es).
context.register(HibernateConfigurationFactory.class);

context.refresh();
+2

Source: https://habr.com/ru/post/1531128/


All Articles