2016-02-22 5 views
1

У меня две базы данных, работающие параллельно.Несколько SessionFactory/TransactionManager: сеанс не найден для текущего потока

Я создал две конфигурации с разными GenericDAO/SessionFactories для каждого из них, однако второй экземпляр SessionFactory, который должен быть создан, имеет проблемы. Когда я пытаюсь выполнить getCurrentSession() Я получаю эту ошибку: org.hibernate.HibernateException: сеанс не найден для текущей темы.

Config1.xml:

<bean id="mainDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/main" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

<bean id="mainSessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="mainDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.avocat.domain.entities.main.User</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 

<bean id="mainTransactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="mainDataSource" /> 
    <property name="sessionFactory" ref="mainSessionFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="mainTransactionManager" /> 
<context:annotation-config /> 

Config2.xml:

<bean id="fakeDataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost/fake" /> 
    <property name="username" value="root" /> 
    <property name="password" value="" /> 
</bean> 

<bean id="fakeSessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="fakeDataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.avocat.domain.entities.intra.Bla</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
     </props> 
    </property> 
</bean> 

<bean id="fakeTransactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="dataSource" ref="fakeDataSource" /> 
    <property name="sessionFactory" ref="fakeSessionFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="fakeTransactionManager" /> 
<context:annotation-config /> 

MainGenericDAO:

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

protected Session currentSession() 
{ 
    return mainSessionFactory.getCurrentSession(); 
} 

FakeGenericDAO:

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

protected Session currentSession() 
{ 
    return fakeSessionFactory.getCurrentSession(); 
} 

Config1 объявляется перед тем Config2.
Кроме того, запросы, использующие MainGenericDAO/MainSessionFactory, в порядке. Но currentSession() от FakeGenericDAO возвращает ошибку.

+0

Вы использовали аннотацию @Transactional? –

+0

Да, я это сделал. Должен ли я указать что-то после @Transactional? – Majid

ответ

1

Похоже, что транзакция не создана на вашем втором DAO для FakeSessionFactory. Вы должны использовать @Transactional("fakeTransactionManager") на FakeGenericDAO.

Смежные вопросы

 Смежные вопросы