Spring中自动加载Hibernate配置文件

本文介绍了一种自定义SessionFactoryBean的方法,通过该方法可以在不修改配置文件的情况下自动加载所有以.hbm.xml结尾的映射文件。此外,还介绍了如何为Hibernate实体类自动注册HibernateClassEditor,以便于对象关联。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值