我正在使用Spring和Hibernate,Spring的配置如下。如何配置两个数据源, session factories。使用注释管理事务。请指教
<!-- we can use annotations --> <context:annotation-config/> <!-- package to look for annotated classes --> <context:component-scan base-package="com.XXX.XXX.service.impl"/> <!-- we will manage transactions with annotations --> <tx:annotation-driven/> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- configure hibernate session factory --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" p:url="jdbc:sqlserver://DB_NAME\DB_INSTANCE:DB_PORT;databaseName=DB_NAME;username=DB_USER;password=DB_PASSWORD;" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="show_sql">false</prop> </props> </property> </bean>
<!-- configure hibernate session factory for FirstDB --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" p:url="jdbc:sqlserver://${FirstDB_DB_HosName}\${FirstDB_DB_instanceName}:${FirstDB_DB_PortNumber};databaseName=${FirstDB_DB_DatabaseName};username=${FirstDB_DB_UserName};password=${FirstDB_DB_Password};" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation"> <value>classpath:hibernate.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="show_sql">false</prop> </props> </property> </bean> <!-- configure hibernate session factory for SecondDB database --> <bean id="SecondDBdataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" p:driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" p:url="jdbc:sqlserver://${SecondDB_DB_HOST}\${SecondDB_DB_INSTANCE}:${SecondDB_DB_PORT};databaseName=${SecondDB_DB_DATABASENAME};username=${SecondDB_DB_USERNAME};password=${SecondDB_DB_PASSWORD};" /> <bean id="secondDBSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="SecondDBdataSource" /> <property name="configLocation"> <value>classpath:hibernate-SecondDB.cfg.xml</value> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> <prop key="hibernate.current_session_context_class">thread</prop> <prop key="show_sql">false</prop> </props> </property> </bean>
在Hibernate DAO中,我们可以使用@Qualifier注释,如下所示连接2个会话工厂
/** * Basic DAO operations dependent with Hibernate's specific classes * @see SessionFactory */ @Transactional(propagation= Propagation.REQUIRED, readOnly=false) public class HibernateDao<E, K extends Serializable> implements GenericDao<E, K> { @Autowired @Qualifier(value="sessionFactory") private SessionFactory sessionFactory; @Autowired @Qualifier(value="secondDBSessionFactory") private SessionFactory secondDBSessionFactory; protected Class<? extends E> daoType; public HibernateDao() { daoType = (Class<E>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; } //Remaining Code }