spring Hibernate Multi SessionFactories和TransactionManager

时间:2016-06-14 22:46:22

标签: java spring hibernate java-ee spring-data

我是春天和休眠的新手。在我的场景中,我正在构建一个应用程序,它可以根据用户选择的环境连接到不同的环境Db(devl,qual,prod) ..为此,我正在制作多个SessionFactory bean,并根据用户选择的env在DAO类中使用@Qualifier来区分它们。

在这里,我很震惊,如果在我的情况下需要或不需要多个TransactionTraagers,如果不需要多个TransactionManagers,如何处理代码..? 因此我不确定如何在每个env中使用不同的TransactionManage,因为相同的保存方法会将用户表单数据保存在DB中.Below是我的spring .xml文件和DAO类代码,用于区分sessionFactory wrt env ..

配置多个TransactionManagers所需的帮助,或者我可以放弃使用TransactionManager并简单地将事务与Hibernate会话区分开来(beginTransaction).. !!

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSourceProd" />
  </bean>

  <bean id="txManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

<bean id="dataSourceProd" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=SM_PROD" />
        <property name="username" value="sa" />
        <property name="password" value="123" />
    </bean>

     <!-- Hibernate Properties -->
     <bean id="prodSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSourceProd" />
        <property name="packagesToScan" value="com.deere.dsfj.siteMinder.domain" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                 <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>


    <bean id="dataSourceDevl" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
        <property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=SM_Devl" />
        <property name="username" value="sa" />
        <property name="password" value="123" />
    </bean>

     <bean id="DevlSessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSourceDevl" />
        <property name="packagesToScan" value="com.deere.dsfj.siteMinder.domain" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop>
                 <prop key="hibernate.current_session_context_class">thread</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

以下是DAO代码..

public void BeginTransaction(String targetEnv)
    {
        getCurrentSession(targetEnv).getTransaction().begin();
    }

    @Autowired
    @Qualifier("DevlSessionFactory")
    private SessionFactory devlSessionFactory;

    @Autowired
    @Qualifier("prodSessionFactory")
    private SessionFactory prodSessionFactory;

    protected final Session getCurrentSession(String targetEnv)
    {
          if(targetEnv!=null && !"".equals(targetEnv) && targetEnv.equals("Devl"))
          {
              return devlSessionFactory.getCurrentSession(); 
          }
          else if(targetEnv!=null && !"".equals(targetEnv) && targetEnv.equals("PROD"))
          {
              return prodSessionFactory.getCurrentSession();
          }

          return null;

    }

感谢帮助...

0 个答案:

没有答案