在 web 应用中,我们使用 Spring 3.2 和 Hibernate 4.1.1 实现插件式架构。插件可以在运行时添加和删除。我们为每个模块定义了一个单独的类加载器,并在 Spring 上创建了单独的子应用程序上下文。所有配置都使用注解完成,不再需要 XML 配置 bean。以下是 Spring Hibernate 配置类:
现在的问题是: 一些插件包含其自己的实体(+DAO)类,这些类在运行时与模块一起添加。
是否可以在Hibernate上创建某种分离的上下文(就像我们在Spring上做的那样),甚至添加/重新加载其他实体类?
重新加载EntityManager是否符合我的需求? 但是,在上下文中已经加载的实体会发生什么?
非常感谢任何提前给予的帮助和评论。
更新: 实际上,我做了以下事情并解决了该问题(但后来遇到了另一个问题)。 为每个模块/上下文创建一个新的DataSource + SessionFactory + TransactionManager,并将它们插入到新的子ApplicationContext中。 现在,我使用类加载器来扫描所有注释类,并通过使用手动注册它们到应用程序上下文和会话工厂来解决问题。
@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使用系统类加载器而不是我的自定义插件类加载器。
有没有人知道如何将自己的类加载器注入到Hibernate中呢?