我有一个Spring MVC项目,其中包含一个通用的应用程序上下文xml文件。这个文件定义了我的应用程序的一般配置,比如i18n的基本属性文件和连接到数据库的数据源等。当我定义这个上下文文件时,我还想定义会话工厂,它将具有基本配置,例如要使用的数据源、二级缓存(eh-cache)等等。但是这将不包含我的应用程序将加载的实体bean的列表。我只想将实体bean的映射保存在单独的文件中,并根据需要加载它们。
有没有可能扩展我在基本文件中定义的会话工厂,只添加额外的实体bean?我最终会有几个spring配置文件,它们将加载一组单独的实体。这是否可以做到呢?
发布于 2012-05-18 20:17:24
有几种可能性。
PropertyPlaceHolderConfigurer将实体列表外部化到属性文件。(可以在属性文件中使用SPEL )。PropertySource.定义,并将其用作其他sessionFactory bean中的父级,然后可以基于Enviroment bean导入这些bean
请注意,Hibernate SessionFactory在构建之后是不可变的,并且SessionFactoryBean在afterPropertiesSet方法中构建SessionFactory,因此设置您想要的SessionFactoryBean的工作必须由某个BeanFactoryPostProcessor完成
编辑
读完您的评论后,我认为您可以声明一个EntityClassHolder bean,并使用Autowire集合工具来获取EntityClassFactoryBean中的所有实体,您可以将这些实体注入到单个SessionFactoryBean中。但我不确定这是不是你想做的:
public class EntityClassHolder {
List<Class<?>> entityClasses;
public List<Class<?>> getEntityClasses() {
return entityClasses;
}
public void setEntityClasses(List<Class<?>> entityClasses) {
this.entityClasses = entityClasses;
}
}
public class EntityClassFactoryBean extends AbstractFactoryBean<List<Class<?>>> {
@Autowired
List<EntityClassHolder> list;
@Override
public Class<?> getObjectType() {
return List.class;
}
@Override
protected List<Class<?>> createInstance() throws Exception {
ArrayList<Class<?>> classList = new ArrayList<Class<?>>();
for (EntityClassHolder ech : list) {
classList.addAll(ech.getEntityClasses());
}
return classList;
}
}现在,如果您有几个applicatonContext-xxx.xml,那么当您加载其中一个时,将使用在EntityClassHolder beans中定义的实体类来配置SessionFactory。
https://stackoverflow.com/questions/10647830
复制相似问题