【问题标题】:Spring session factory is always null for multiple datasources对于多个数据源,Spring 会话工厂始终为空
【发布时间】:2016-11-27 13:26:20
【问题描述】:

我正在尝试通过 Spring 4 SessionFactory DI 在我的应用程序中 @Autowire 多个 Hibernate SessionFactory。只有一个 Datasource(epi) 被正确注入,但其他两个 Datasources SessionFactory 值始终为空。 其中两个是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 的 Autowired sessionFactory 值始终为空。

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


@Transactional("eveTransactionManager")
public class EveBaseService {

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

请告诉我我在这里缺少什么。

【问题讨论】:

    标签: spring hibernate spring-mvc sessionfactory


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 2015-02-07
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2020-02-04
      • 2016-11-07
      相关资源
      最近更新 更多