首页 文章

对于多个数据源,Spring会话工厂始终为null

提问于
浏览
2

我试图通过Spring 4 SessionFactory DI在我的应用程序中@Autowire多个Hibernate SessionFactory . 只有一个Datasource(epi)被正确注入,但其他两个Datasources SessionFactory值始终为null . 其中两个是oracle数据库,另一个是DB2 . 我不确定我做错了什么 .

这是我的spring-Datasource.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="
         http://www.springframework.org/schema/beans  
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


<bean id="epiStageDS" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/>
        <property name="url" value="" />
        <property name="username" value="" />
        <property name="password" value="" />
    </bean>


    <bean id="epi"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
    </bean>

    <bean id="eveDS"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
    <property name="url" value="" />
    <property name="username" value="" />
    <property name="password" value="" />
    </bean>

    <!-- Session factory for EPI db -->
    <bean id="episessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="epi" />
    <property name="packagesToScan">
        <list>
            <value>edu.eve.model</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql:false}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql:false}</prop>
        </props>
    </property>
</bean>


<!-- EVE DS SESSION FACTORY -->

    <bean id="eveSessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="eveDS" />
    <property name="packagesToScan">
        <list>
            <value>edu.eve.model</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql:false}</prop>
            <prop key="hibernate.format_sql">${hibernate.format_sql:false}</prop>
        </props>
    </property>
</bean>

<!-- Session factory for Stage DS db -->

    <bean id="stageDsSessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="epiStageDS" />
    <property name="packagesToScan">
        <list>
            <value>edu.eve.model</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.DB2Dialect</prop>
            <prop key="hibernate.show_sql">${hibernate.db2.show_sql:false}</prop>
            <prop key="hibernate.format_sql">${hibernate.db2.format_sql:false}</prop>
        </props>
    </property>
</bean>


<bean id="epiTransactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="episessionFactory" />
</bean>
<bean id="eveTransactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="eveSessionFactory" />
</bean>
<bean id="stageDsTransactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="stageDsSessionFactory" />
</bean>

<bean id="persistenceExceptionTranslationPostProcessor"

    class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

以下是我自动装配SessionFactory的类 .

sessionFactory下面会被完美地注入 .

@Transactional("epiTransactionManager")
public class EpiBaseService {

@Autowired
@Qualifier("episessionFactory")
private SessionFactory sessionFactory;

对于下面的DS,自动装配的sessionFactory值始终为null .

@Transactional("stageDsTransactionManager")
public class StageDsBaseService {
@Autowired
@Qualifier("stageDsSessionFactory")
private SessionFactory sessionFactory;


@Transactional("eveTransactionManager")
public class EveBaseService {

@Autowired
@Qualifier("eveSessionFactory")
private SessionFactory sessionFactory;

请告诉我这里缺少什么 .

1 回答

  • 0

    我知道我做错了什么 . 我正在创建一个服务类的新对象而不是Spring控制器内的@Autowiring . 我这样做是为了确保我的sessionfactory不是null但看起来这不是正确的方法 . 您必须使用Spring IOC容器在控制器中注入服务类 . 现在所有sessionFactories都正确连接到指定的数据源 .

相关问题