Spring+Hibernate多数据源配置

本文介绍了一种在Spring框架下配置多个数据源并为不同数据源提供DAO支持的方法。通过具体示例展示了如何定义不同的数据源、SessionFactory,并实现了两个泛型DAO支持类DaoSupportImpl和DaoSupportImpl2,分别对应不同的数据源。

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

数据源1

<bean id="dataSource"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<!-- 连接信息 -->
		<property name="driverClass"
			value="${driverClass}">
		</property>
		<property name="jdbcUrl"
			value="${jdbcUrl}">
		</property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
	</bean>

数据源2

<bean id="dataSourceB"
		class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close">
		<!-- 连接信息 -->
		<property name="driverClass"
			value="${driverClass}">
		</property>
		<property name="jdbcUrl"
			value="${jdbcUrl2}">
		</property>
		<property name="user" value="${user}"></property>
		<property name="password" value="${password}"></property>
		</bean>
sessionFactory1

<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSource" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					<!-- SQLServerDialect   MySQLDialect  -->
					org.hibernate.dialect.SQLServerDialect
				</prop>
				<!-- 显示sql语句 -->
				<prop key="show_sql">true</prop>
				<!-- 自动建表
				<prop key="hibernate.hbm2ddl.auto">update</prop>  -->
			</props>
		</property>
		<property name="mappingResources">
			<list>
			<!-- 用户 -->
			<value>com/hhit/entity/User.hbm.xml</value>
<span style="white-space:pre">			</span></list>
		</property>
</bean>

sessionFactory2

<bean id="sessionFactory2"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="dataSourceB" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					<!-- SQLServerDialect   MySQLDialect  -->
					org.hibernate.dialect.SQLServerDialect
				</prop>
				<!-- 显示sql语句 -->
				<prop key="show_sql">true</prop>
				<!-- 自动建表
				<prop key="hibernate.hbm2ddl.auto">update</prop>  -->
			</props>
		</property>
		<property name="mappingResources">
			<list>
			<!-- 考试监控系统-->
			<value>com/hhit/entity/TestingControl.hbm.xml</value>
			<value>com/hhit/entity/TestRoom.hbm.xml</value>
			
			</list>
		</property>
	</bean>

DaoSupportImpl

public class DaoSupportImpl<T> implements IDaoSupport<T> {

	@Resource
	private SessionFactory sessionFactory;
	
	private Class<T> clazz;
	public DaoSupportImpl(){
		//使用反射得到T的真实类型
		//获取new的对象的泛型的父类类型
		ParameterizedType pt= (ParameterizedType) this.getClass().getGenericSuperclass();
		//获取第一个类型的真实类型
		this.clazz=(Class<T>) pt.getActualTypeArguments()[0];
		System.out.println("--->clazz"+clazz);
	}
	/**
	 * 获取当前Session对象
	 * protected子类中可以得到
	 * @return
	 */
	protected Session getSession(){
//		if(sessionFactory.getCurrentSession()==null)
//			return sessionFactory.openSession();
		return sessionFactory.getCurrentSession();
	}
	
	@Override
	public void save(T entity) {
		getSession().save(entity);
	}
}

DaoSupportImpl2

public class DaoSupportImpl2<T> implements IDaoSupport<T> {

	@Resource(name="sessionFactory2")
	private SessionFactory sessionFactory2;
	
	private Class<T> clazz;
	public DaoSupportImpl2(){
		//使用反射得到T的真实类型
		//获取new的对象的泛型的父类类型
		ParameterizedType pt= (ParameterizedType) this.getClass().getGenericSuperclass();
		//获取第一个类型的真实类型
		this.clazz=(Class<T>) pt.getActualTypeArguments()[0];
		System.out.println("--->clazz"+clazz);
	}
	/**
	 * 获取当前Session对象
	 * protected子类中可以得到
	 * @return
	 */
	protected Session getSession(){
//		if(sessionFactory.getCurrentSession()==null)
//			return sessionFactory.openSession();
		return sessionFactory2.getCurrentSession();
	}
	
	@Override
	public void save(T entity) {
		getSession().save(entity);
	}
}

这种做法的关键是在basedao,也就是我的DaoSupportImpl中定义的private SessionFactory sessionFactory;和DaoSupportImpl2中定义的private SessionFactory sessionFactory2;用注解让sessionfactory按照名称注入,与spring配置文件中的sessionfactory名称相对应,然后不同数据源的dao继承不同的DaoSupportImpl。当然,其中DaoSupportImpl使用了匿名类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值