Hibernate utilisant plusieurs bases de données
Que quelqu'un sait comment ajouter une autre source de données dans hibernate et comment configurer le Printemps de cette source de données de ses autoinject dans mon respectifs DAO?
C'est mon code avec une source de données, qui fonctionnent parfaitement, mais je ne sais pas comment les ajouter une autre source de données. Je veux ajouter une autre source de données est une base de données avec les différentes tables de la base de données réelle.
HIBERNATE CONF
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url" value="jdbc:mysql://localhost/personal"/>
<property name="username" value="root"/>
<property name="password" value="mysql"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="packagesToScan">
<list>
<value>com.app.personal.model</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">false</prop>
</props>
</property>
</bean>
<tx:annotation-driven/>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
DAO EXEMPLE
@Repository
public class ModuloDAOHibernate extends HibernateTemplate implements ModuloDAO {
@Autowired
public ModuloDAOHibernate(SessionFactory sessionFactory) {
super(sessionFactory);
}
public List<Modulo> getAllGrupoModuloDAO() {
Criteria criteriaList = this.getSession().createCriteria(Modulo.class);
criteriaList.addOrder(Order.asc("orden"));
return criteriaList.list();
}
source d'informationauteur richardhell
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous avez un ensemble de DAOs qui doivent utiliser des
dataSource1
et appropriéesessionFactory1
tandis que d'autres doivent utiliser différentesdataSouce2
etsessionFactory2
basé surdataSource2
. Bien sûr, vous devez déclarer votre deuxièmedataSource
et autres haricots: il suffit de copier la configuration que vous avez déjà et changement bean id de sorte qu'ils ne s'entrechoquent pas. Tout doit être mis en miroir à l'exception<tx:annotation-driven/>
:Et c'est là le vrai problème: vous disposez maintenant de deux gestionnaires de transactions liés à différentes session usines, qui à son tour sont acheminés vers les différentes sources de données. Mais
@Transactional
annotations toujours utiliser une seule transaction manager - le nom detransactionManager
par défaut (remarque je expressément indiquétransactionManager1
. Cela signifie que DAOs au moyen de la deuxième source de données permettra de participer à des transactions a commencé à l'intérieur de la première source de données - ce n'est évidemment pas ce que prévu.Il y a quelques solution de contournement, à l'instar de définir explicitement le gestionnaire de transactions de nom dans
@Transactional
annotation (jamais essayé) ou à l'aide deTransactionTemplate
mais comme vous pouvez le voir le problème doit être bien pensée.Comme pour permettra à l'autowiring - si vous autowire par nom, nom de votre champs de la même session d'usines ou de sources de données ids et il devrait fonctionner - mais c'est votre petit problème en fait.
ok. J'ai trouver une autre solution, et c'est à l'aide de la même méthode comme ceci: ajouter une autre source de données et SessionFactory, à côté de la méthode de DAO qui injject de la sessionFactory ajouter l' @Qualifier anottation withe la propriété de la sessionFactory nécessaire, comme ceci:
J'ai eu ce même problème. J'ai résolu ce problème en créant:
applicationContext.xml
dans Dao injecté sessionFactory avec le Qualificatif d'annotation. Dans mon cas, j'ai eu génériques BaseEnity:
et dans le service de haricots à l'aide de l'annotation:
Averythings wokrs amende.
J'ai eu le même problème. Je l'ai résolu comme ceci:
Tout d'abord, il doit être différent cfg.xml les fichiers de bases de données différentes. Il suffit ensuite d'utiliser la Configuration de l'objet de la mise en veille prolongée lorsque vous souhaitez vous connecter à votre deuxième base de données.
J'ai trouvé ça ici : http://www.coderanch.com/t/468821/ORM/java/If-hibernate-cfg-xml-has
Je suis assez sûr que cela peut être étendu à plus de 2 bases de données.
Espérons que cette aide.