【发布时间】:2014-04-14 18:56:03
【问题描述】:
在 Web 应用程序上,我们使用 Spring 3.2 和 Hibernate 4.1.1 并实现类似插件的架构。 可以在运行时添加和删除插件。 对于每个模块,我们定义了一个单独的类加载器并在 spring 上创建单独的子应用程序上下文。 使用注释完成完整的配置,不再为 bean 配置 XML。
Spring Hibernate 配置类
@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;
}
}
现在的问题: 一些插件包含自己的实体 (+DAO) 类,这些类在运行时与模块一起添加。
是否可以在 hibernate 上创建某种单独的上下文(就像我们在 spring 上所做的那样),甚至可以添加/重新加载其他实体类?
重新加载 EntityManager 是否符合我的需求? 但是上下文中已经加载的实体会发生什么?
感谢您提前提供任何帮助和评论。
更新: 实际上我做了以下并解决了这个问题(但遇到了另一个问题......稍后)。
我为每个模块/上下文创建一个新的 DataSource + SessionFactory + TransactionManager 并将它们插入到新的子 ApplicationContext 中。 现在我使用类加载器扫描所有带注释的类,并通过使用在应用程序上下文和会话工厂中手动注册它们
LocalSessionFactorybean#setAnnotatedClasses(...)
这很好用……但是……
下一个问题: 我得到一个 ClassNotFoundException 这似乎是一个类加载器问题。 Hibernate 使用系统类加载器,而不是我自己的 pluginClassloader。
有人知道如何将自己的类加载器注入 Hibernate 吗?
【问题讨论】:
标签: java spring hibernate spring-mvc