在使用Hibernate开发程序时,往往有时需要每个类都需要建立一个映射配置文件,那当没增加或删除一个类时,就需要更改一下Hibernate的.cfg.xml配置文件,以决定使用哪些映射配置文件。
下面给出了一个自己编写的类,配置后可以自动查找路径中所有以.hbm.xml结尾的文件,并把其中的配置信息加入到Hibernate中,这样就不需要增减类映射文件时都要更改.cfg.xml文件。
import java.io.IOException;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.PersistentClass;
import org.nci.asd.bean.CustomClassEditorManager;
import org.nci.asd.bean.HibernateClassEditor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
/**
* @author yao
* 自动寻找所有以.hbm.xml结尾的文件,加入到Hibernate配置中
* 并为Hibernate中定义的每一个类添加HibernateClassEditor,保证对象保存时可以通过id直接建立对象关联
*/
public class SessionFactoryBean extends LocalSessionFactoryBean implements BeanFactoryAware,BeanFactoryPostProcessor{
private DefaultListableBeanFactory beanFactory;
/**
* Spring会自动进行注入
* 记录BeanFactory,以在postProcessConfiguration中自动加入所有的Hibernate映射
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException{
this.beanFactory = (DefaultListableBeanFactory) beanFactory;
}
/**
* @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#postProcessConfiguration(org.hibernate.cfg.Configuration)
*
* 自动加入类路径中所有匹配的Hibernate映射文件
*/
@Override
protected void postProcessConfiguration(Configuration config) throws HibernateException {
ResourcePatternResolver rp = new PathMatchingResourcePatternResolver(beanFactory.getBeanClassLoader());
Resource[] resources;
try {
resources = rp.getResources("/**/*.hbm.xml");
for(int i=0;i<resources.length;i++){
Resource resource = resources[i];
//将找到的配置文件加入
if(resource.exists())
config.addInputStream(resource.getInputStream());
}
} catch (IOException e) {
e.printStackTrace();
}
super.postProcessConfiguration(config);
}
/*
* @see org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
* 在CustomClassEditorManager中加入Editor定义
*/
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Iterator cIter = this.getConfiguration().getClassMappings();
while(cIter.hasNext()){
PersistentClass pc = (PersistentClass) cIter.next();
String className = pc.getClassName();
//为Hibernate中定义的每一个类加入自定义的编辑器
try {
CustomClassEditorManager.registerCustomEditor(Class.forName(className), new HibernateClassEditor(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
在Spring配置文件中,将SessionFactory配置成自定义的类
<bean id="sessionFactory" class="self.hibernate.SessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
下面给出了一个自己编写的类,配置后可以自动查找路径中所有以.hbm.xml结尾的文件,并把其中的配置信息加入到Hibernate中,这样就不需要增减类映射文件时都要更改.cfg.xml文件。
import java.io.IOException;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Configuration;
import org.hibernate.mapping.PersistentClass;
import org.nci.asd.bean.CustomClassEditorManager;
import org.nci.asd.bean.HibernateClassEditor;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;
/**
* @author yao
* 自动寻找所有以.hbm.xml结尾的文件,加入到Hibernate配置中
* 并为Hibernate中定义的每一个类添加HibernateClassEditor,保证对象保存时可以通过id直接建立对象关联
*/
public class SessionFactoryBean extends LocalSessionFactoryBean implements BeanFactoryAware,BeanFactoryPostProcessor{
private DefaultListableBeanFactory beanFactory;
/**
* Spring会自动进行注入
* 记录BeanFactory,以在postProcessConfiguration中自动加入所有的Hibernate映射
*/
public void setBeanFactory(BeanFactory beanFactory) throws BeansException{
this.beanFactory = (DefaultListableBeanFactory) beanFactory;
}
/**
* @see org.springframework.orm.hibernate3.LocalSessionFactoryBean#postProcessConfiguration(org.hibernate.cfg.Configuration)
*
* 自动加入类路径中所有匹配的Hibernate映射文件
*/
@Override
protected void postProcessConfiguration(Configuration config) throws HibernateException {
ResourcePatternResolver rp = new PathMatchingResourcePatternResolver(beanFactory.getBeanClassLoader());
Resource[] resources;
try {
resources = rp.getResources("/**/*.hbm.xml");
for(int i=0;i<resources.length;i++){
Resource resource = resources[i];
//将找到的配置文件加入
if(resource.exists())
config.addInputStream(resource.getInputStream());
}
} catch (IOException e) {
e.printStackTrace();
}
super.postProcessConfiguration(config);
}
/*
* @see org.springframework.beans.factory.config.BeanFactoryPostProcessor#postProcessBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
* 在CustomClassEditorManager中加入Editor定义
*/
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
Iterator cIter = this.getConfiguration().getClassMappings();
while(cIter.hasNext()){
PersistentClass pc = (PersistentClass) cIter.next();
String className = pc.getClassName();
//为Hibernate中定义的每一个类加入自定义的编辑器
try {
CustomClassEditorManager.registerCustomEditor(Class.forName(className), new HibernateClassEditor(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
}
在Spring配置文件中,将SessionFactory配置成自定义的类
<bean id="sessionFactory" class="self.hibernate.SessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>