2012-03-26 13 views
0

Il y a eu plusieurs discussions sur ce sujet sur le site, mais j'utilise des annotations partout pour créer sessionFactory.Plusieurs bases de données utilisant Hibernate dans le style d'annotation

private SessionFactory sessionFactory; 

@Autowired 
public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 

Voici comment hibernate.cfg.xml ressemble

<hibernate-configuration> 
<session-factory> 
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
    <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.password">xxxxx</property> 
    <property name="hibernate.connection.url">xxxxx</property> 
    <property name="hibernate.connection.username">XXXX</property> 
    <property name="hibernate.connection.characterEncoding">utf-8</property> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> 
    <property name="hibernate.format_sql">true</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.use_sql_comments">true</property> 
    <mapping class="XXXX" /> 
</session-factory> 
</hibernate-configuration> 

C'est applicationContext.xml

<!-- add tomcat datasource instance to springs context --> 
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:comp/env/jdbc/XXXXDS" /> 
    <property name="resourceRef" value="true" /> 
</bean> 

Comment puis-je obtenir l'intégration de multiples DB dans ce cas. Une solution que je suis tombé sur était de créer plusieurs hibernate.cfg.xml et de créer une autre usine de session pour cela.

Mais j'ai deux doutes, 1) Comment est-ce que j'indique dans autowiring, quel sessionFactory choisir, 2) je devrais dupliquer beaucoup d'information à travers hibernate.xml, par exemple beans. Y a-t-il une approche plus propre pour ce problème?

+0

Y a-t-il une raison pour laquelle vous ne voulez pas/ne pouvez pas utiliser l'injection de bean pour les DAO? Cela résoudrait votre problème. – bvulaj

+0

Désolé, mais pourriez-vous s'il vous plaît être plus précis, donnez-moi quelques exemples, des liens pour cette approche. Je m'habitue à Spring + Hibernate donc c'est une situation unique pour moi. –

+0

Réponse postée ci-dessous. – bvulaj

Répondre

2

Première question: @Autowired avec @Qualifier ("nom") vous aidera à choisir qui sessionFatory. Deuxième question: vous pouvez définir les propriétés d'hibernation: schéma et catalogue pour spécifier la base de données lorsque vous travaillez sur plusieurs bases de données. J'ai l'expérience avec MS SQL Server, donc dans l'entité j'ai ajouté l'annotation @Table ("[base de données]. [Schéma]. [Nom_table]") et le mappage à la table spécifique dans plusieurs bases de données.

+0

oui ce sol fonctionne parfaitement. Merci. J'ai ajouté cela plus tôt, mais d'une manière ou d'une autre le commentaire manquait. –

0

Publié dans la référence aux commentaires.

session: usines

<bean id="mySessionFactory1" class="..."> 
    ... 
</bean> 
<bean id="mySessionFactory2" class="..."> 
    ... 
</bean> 

Votre DAOs:

<bean id="myHibernateDao1" abstract="true" p:sessionFactory-ref="mySessionFactory1" /> 
<bean id="myHibernateDao2" abstract="true" p:sessionFactory-ref="mySessionFactory2" /> 

<bean id="myObj1Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj2Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj3Dao" parent="myHibernateDao1" class="..." /> 
<bean id="myObj4Dao" parent="myHibernateDao2" class="..." /> 
<bean id="myObj5Dao" parent="myHibernateDao2" class="..." /> 
0
import java.util.Properties; 

import javax.sql.DataSource; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.context.annotation.PropertySources; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 

@Configuration 
@ComponentScan({ "component.name" }) 
@PropertySources(@PropertySource(value = {"file:/file1.properties", "classpath:file2.properties"})) 
public class HibernateConfiguration { 

    @Bean 
    public LocalSessionFactoryBean firstSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(firstDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.test" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource firstDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("DRIVER_NAME"); 
     dataSource.setUrl("DATABASE_URL"); 
     dataSource.setUsername("DATABASE_USER"); 
     dataSource.setPassword("DATABASE_PASS"); 
     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean secondSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(secondDataSource()); 
     sessionFactory.setPackagesToScan(new String[] { "com.test" }); 
     sessionFactory.setHibernateProperties(hibernateProperties()); 
     return sessionFactory; 
    } 

    @Bean 
    public DataSource secondDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName("DRIVER_NAME"); 
     dataSource.setUrl("DATABASE_URL"); 
     dataSource.setUsername("DATABASE_USER"); 
     dataSource.setPassword("DATABASE_PASS"); 
     return dataSource; 
    } 


    private Properties hibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", org.hibernate.dialect.DB2Dialect); 
     properties.put("hibernate.show_sql", true); 
     properties.put("hibernate.format_sql", true); 
     properties.put("hibernate.default_schema", SCHEMA_NAME); 
     return properties;   
    } 

    @Bean 
    public HibernateTransactionManager firstTransactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(firstSessionFactory().getObject()); 
     return txManager; 
    } 

    @Bean 
    public HibernateTransactionManager rdsaTransactionManager() { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(); 
     txManager.setSessionFactory(rdsaSessionFactory().getObject()); 
     return txManager; 
    } 


} 
Questions connexes