style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

multiples conexiones en hibernate + spring mvc

hola.
Tengo una aplicacion con hibernate y spring mvc, y resulta que quiero consultar tablas de diferentes base de datos. quiero saber si puedo hacerlo desde el archivo de configuracion de spring..

mi archivo es

  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
      <property name="dataSource" ref="dataSource" />
      <property name="mappingLocations">
          <list><value>classpath:com/upa/org/domain/Noticias.hbm.xml</value></list>
      </property>
      <property name="hibernateProperties" >
          <value>
              hibernate.dialect                       =   org.hibernate.dialect.MySQLDialect
              hibernate.format_sql                    =   true
              hibernate.show_sql                      =   true
          </value>
      </property>
  </bean>
 
  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/jsp-noticias"/>
      <property name="username" value="root"/>
      <property name="password" value=""/>
  </bean>

   <tx:annotation-driven transaction-manager="transactionManager" />
   <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
       <property name="sessionFactory" ref="sessionFactory"/>
   </bean>
   
   <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

Esto funciona perfectamente. Ahora mi pregunta puedo crear otro bean de tipo org.springframework.orm.hibernate3.LocalSessionFactoryBean y que tenga una referencia a otro datasouce con los datos de la otra base de datos??? o tengo que cerrar la session primera y como se realizaria?.

mi classe donde se hace la inyeccion es:

@Repository
public class NoticiasDaoImp implements NoticiasDao{
   
    private JdbcTemplate jdbcTemplate;
    private HibernateTemplate hibernateTemplate;
   
    @Autowired
    public void NoticiasDaoImp(SessionFactory sessionFactory){
        this.hibernateTemplate = new HibernateTemplate(sessionFactory);
        this.jdbcTemplate = new JdbcTemplate(SessionFactoryUtils.getDataSource(sessionFactory) );
    }
   
    @Override
    public List<Noticias> getAll(){
        List<Noticias> result=(List<Noticias>) hibernateTemplate.find("from Noticias n");
        return null;
    }
   
    @Override
    public List<Noticias> getAll(String sql){
        hibernateTemplate.setMaxResults(5);
        List<Noticias> result=(List<Noticias>) hibernateTemplate.find(sql) ;
       
        return result;
    }
}

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de mmjose26

AbstractRoutingDataSource

Creo que te puede ser muy util este bean de Spring.
En base a una anotacion, decides por que data source se va tu dao.
Hay una entrada en el blog de Mark fisher,

"Dynamic DataSource Routing"

http://blog.springsource.org/2007/01/23/dynamic-datasource-routing/

donde explica a detalle su uso.

Saludos!

Imagen de Nopalin

Si se puede

Claro que puedes, lo unico que tienes que hacer es crear dos cosas de todo, del datasource, del transaction manager, el session manager de hibernate, etc. La diferencia va a radicar en el AOP. En los transaction manager como lo tienes definido se va a inyectar en todolo que encuentre como @Transactional o alguna otra anotacion que sirva para lo mismo. Lo que debes hacer es indicarle a los transaction manager los aspectos que lo utilizaran. En este ejemplo (definido todo por xml, ya le buscas si lo quieres en puras anotaciones) quedaría algo así:

<!-- DATA SOURCES -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driver}"/>
  <property name="url" value="${jdbc.url}"/>
  <property name="username" value="${jdbc.username}"/>
  <property name="password" value="${jdbc.password}"/>
</bean>

<bean id="dataSourceDos" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="${jdbc.driver.dos}"/>
  <property name="url" value="${jdbc.url.dos}"/>
  <property name="username" value="${jdbc.username.dos}"/>
  <property name="password" value="${jdbc.password.dos}"/>
</bean>

<!--SESSION FACTORIES -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource"> <ref bean="dataSource"/> </property>
  <property name="hibernateProperties"> ... </property>
  <property name="annotatedClasses"> <list> ... </list> </property>
  <property name="mappingLocations"> <list> ... </list> </property>
</bean>

<bean id="sessionFactorydos" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
  <property name="dataSource"> <ref bean="dataSourceDos"/> </property>
  <property name="hibernateProperties"> ... </property>
  <property name="annotatedClasses"> <list> ... </list> </property>
  <property name="mappingLocations"> <list> ... </list> </property>
</bean>

<!-- TRANSACTION MANAGERS -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>

<bean id="transactionManagerDos" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactoryDos"/></property>
</bean>

<!-- EXCEPTION HANDLER -->
<bean id="exceptionHandler" class="com.miempresa.server.algo.ExceptionHandler" />

<!-- AOP ADVICES -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="get*" read-only="true"/>
    <tx:method name="*"/>
  </tx:attributes>
</tx:advice>

<tx:advice id="txAdviceDos" transaction-manager="transactionManagerDos">
  <tx:attributes>
    <tx:method name="get*" read-only="true"/>
    <tx:method name="*"/>
  </tx:attributes>
</tx:advice>

<!-- AOP CONFIG -->
<aop:config>
  <aop:pointcut id="services" expression="execution(* com.miempresa.services.uno.*.*(..))"/>
  <aop:pointcut id="servicesDos" expression="execution(* com.miempresa.services.dos.*.*(..))"/>

  <aop:advisor advice-ref="txAdvice" pointcut-ref="services"/>
  <aop:advisor advice-ref="txAdviceDos" pointcut-ref="servicesDos"/>

  <aop:aspect id="exhan" ref="exceptionHandler">
    <aop:after-throwing pointcut-ref="services" throwing="exception" method="wrapIt"/>
  </aop:aspect>

  <aop:aspect id="exhanDos" ref="exceptionHandler">
    <aop:after-throwing pointcut-ref="servicesDos" throwing="exception" method="wrapIt"/>
  </aop:aspect>
</aop:config>

Como te dije, el asunto esta en la definicion de AOP. En esta declaracion estamos declarando 4 proxys de AOP, dos para las transacciones y otros dos para cuando ocurran excepciones. el tag aop:advisor es un especial de spring que es en si mismo un aspect de AOP, es por eso que no necesitamos declararlo con aop:aspect.

Sobres

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">