疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Spring动态加载Hibernate映射文件


 

近来还在整通用的业务系统框架,采用插件的方式加载需要的配置,之前已实现了spring和struts2配置的动态加载,现在剩下Hibernate的映射文件动态加载还没实现,于是搜资料查源码终于实现之。

1、重写SessionFactory类
        新建一个类,继承org.springframework.orm.hibernate3.LocalSessionFactoryBean,
        重写newSessionFactory(Configuration config),
        在该方法中调用config.addFile()方法增加需要动态加载的hbm文件,主要代码:
[java]  
public class ShineSessionFactoryBean extends LocalSessionFactoryBean{  
    @Override  
    protected SessionFactory newSessionFactory(Configuration config) throws HibernateException {  
        config.addFile("xx1.hbm.xml");  //这里将要增加的hbm配置文件都加载到config中  
        config.addFile("xx2.hbm.xml");  
        return super.newSessionFactory(config);  
    }  
}  
2、修改Spring配置文件
      将原来的org.springframework.orm.hibernate3.LocalSessionFactoryBean改成重写后的类,将之前在这里配置的hbm路径去掉,或者保留但不要和插件注入的hbm文件重复,其他属性还是一样。
[html]  
<bean id="sessionFactory" class="com.shine.spring.ShineSessionFactoryBean">  
    <property name="dataSource" ref="dataSource" />  
    <!-- hbm文件已改成通过插件加载  
    <property name="mappingLocations">  
        <list>  
            <value>classpath*:com/shine/**/entity/hbm/*.hbm.xml</value>  
        </list>  
    </property>  
     -->  
</bean>  
 
        然后重启后生效,整合在系统中时得注意几个问题:
1、如果newSessionFactory中是从系统的全局变量中取需加载的hbm文件的话,得在spring容器初始化前就给该全局变量设置好值。
2、动态加载的hbm.xml文件时确保文件路径是存在的,如果要加载的配置文件在jar包中或者不在本机的得针对该配置文件的读取再做封装。
3、如果系统中需有多个SessionFactory时,得让不同的SessionFactory加载不同的hbm配置文件(我通过为SessionFactory增加ID属性来控制)。