Spring动态加载Hibernate映射文件

来源:互联网 发布:仿微信红包网站源码 编辑:程序博客网 时间:2024/05/16 10:33

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

1、重写SessionFactory类
        新建一个类,继承org.springframework.orm.hibernate3.LocalSessionFactoryBean,
        重写newSessionFactory(Configuration config),
        在该方法中调用config.addFile()方法增加需要动态加载的hbm文件,主要代码:

public class ShineSessionFactoryBean extends LocalSessionFactoryBean{@Overrideprotected 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文件重复,其他属性还是一样。

<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属性来控制)。