现在的位置: 首页 > 综合 > 正文

Spring动态加载Hibernate映射文件

2013年08月24日 ⁄ 综合 ⁄ 共 1239字 ⁄ 字号 评论关闭

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

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

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文件重复,其他属性还是一样。

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

抱歉!评论已关闭.