0

J'essaie d'utiliser 2 bases de données dans mon projet de printemps. Cela fonctionne bien si j'utilise 1 base de données mais quand ajouter d'autres bases de données j'obtiens le message d'erreur suivant.dificullty lors de l'utilisation de deux bases de données dans l'application hibernate de printemps

org.hibernate.HibernateException: No Session found for current thread 

dispatcher-servlet

<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="sample" /> 
     <beans:property name="annotatedClasses"> 
      <beans:list> 

           <beans:value>com.kendoui.spring.models.Constraint</beans:value> 

      </beans:list> 
     </beans:property> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect 
       </beans:prop> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
       <beans:prop key="hibernate.format_sql">true</beans:prop> 

      </beans:props> 
     </beans:property> 

    </beans:bean> 


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

    </beans:bean> 


    <beans:bean id="Ascent" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <beans:property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
     <beans:property name="url" value="jdbc:sqlserver://localhost:1433;databaseName=Ascent;" /> 
     <beans:property name="username" value="sa" /> 
     <beans:property name="password" value="abc123" /> 
     <beans:property name="maxActive" value="1" /> 
     <beans:property name="maxIdle" value="1" /> 
    </beans:bean> 

    <beans:bean id="sessionFactory2" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <beans:property name="dataSource" ref="Ascent" /> 
     <beans:property name="annotatedClasses"> 
      <beans:list> 
       <beans:value>com.kendoui.spring.models.ItemOperationSequence</beans:value> 
      </beans:list> 
     </beans:property> 
     <beans:property name="hibernateProperties"> 
      <beans:props> 
       <beans:prop key="hibernate.dialect">org.hibernate.dialect.SQLServer2008Dialect</beans:prop> 
       <beans:prop key="hibernate.show_sql">true</beans:prop> 
       <beans:prop key="hibernate.format_sql">true</beans:prop> 

      </beans:props> 
     </beans:property> 

    </beans:bean> 


    <beans:bean id="transactionManager2" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <beans:property name="sessionFactory" ref="sessionFactory2" /> 

    </beans:bean> 

    <!-- Enable annotation driven transactions. Required by getCurrentSession(). --> 
    <tx:annotation-driven/> 

DAO implemantation

@Transactional("transactionManager2") 
    @Component 
    public class ItemOprSeqDaoImpl implements ItemOprSeqDao { 

     @Autowired 

     private SessionFactory sessionFactory; 

     @Override 
     public List<ItemOperationSequence> getList(String Itemcode) { 
      Session session = sessionFactory.getCurrentSession(); 

      String queryStr= "select * from [@is_itemtrvoprdetails]"; 
      Query query= session.createSQLQuery(queryStr).addEntity(ItemOperationSequence.class); 
      List <ItemOperationSequence> d=query.list(); 
      return d; 
     } 

    } 

J'ai essayé beaucoup de choses différentes mais ça ne marche pas. J'ai essayé d'utiliser <beans:qualifier value="Ascent" /> dans mon servlet et @Qualifier(value="SessionFactory2") dans mon DAO mais rien ne semble fonctionner.

Tout le monde connaît la réponse à ce problème. J'apprécierais vraiment si vous pouviez aider.

Merci d'avance.

+0

doit être défini deux fois. et Sanj

+0

Avez-vous des Entités et des Dépôts séparés pour chaque base de données? –

+0

Je n'utilise que des entités. – mona

Répondre

0

<tx:annotation-driven/><tx:annotation-driven/> doit être déclaré deux fois pour chaque gestionnaire de transactions.

<tx:annotation-driven transaction-manager="transactionManager2"/>

et

<tx:annotation-driven transaction-manager="transactionManager"/>

ajouter également @Qualifier pour

@Autowired 
@Qualifier(value="SessionFactory2") 
private SessionFactory sessionFactory; 
+0

J'ai essayé de le faire mais je reçois l'exception: org.hibernate.HibernateException: Aucune session trouvée pour le fil en cours – mona

0

Vous devez définir un ChainedTransactionManager avec les deux HibernateTransactionManagers en entrée. Je ne suis pas habitué à la configuration print, mais ça devrait ressembler à ça. N'utilisez que @Transactional sans valeur.

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

</beans:bean> 

<beans:bean id="transactionManager2" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <beans:property name="sessionFactory" ref="sessionFactory2" /> 

</beans:bean> 

<beans:bean id="transactionManager" class="org.springframework.data.transaction.ChainedTransactionManager"> 
    <beans:constructor-arg> 
     <list> 
      <beans:ref bean="transactionManager1" /> 
      <beans:ref bean="transactionManager2" /> 
     </list> 
    </beans:constructor-arg> 
</beans:bean> 
+0

J'ai essayé d'utiliser ceci mais j'ai reçu l'exception java.lang.ClassNotFoundException: org.springframework.data.transaction.ChainedTransactionManager. J'ai inclus le pot spring-data-neo4j-tx-3.1.0.RELEASE.pot mais encore il donne la même exception. – mona

+0

Arg votre n'utilisant pas les données de printemps ma mauvaise désolé. –

+0

Ohh je ne l'utilise pas. – mona

0

OK J'ai résolu le problème en faisant cela. première transaction-manager déclaré

<tx:annotation-driven transaction-manager="transactionManager1"/> 

Puis dans mon DAO utilisé

 @Transactional("transactionManager2") 
    @Component 
    public class ItemOprSeqDaoImpl implements ItemOprSeqDao { 

     @Autowired 
     @Qualifier("sessionFactory2") 
     private SessionFactory sessionFactory; 
     //then rest of the code 
} 

Son travail bien maintenant. Merci les gars pour votre aide.