2012-01-05 5 views
1

Я создал двух менеджеров транзакций (один для READ-запросов и другой для запросов READ-WRITE) и двух сессионных заводов для них.Нет сеанса Hibernate, связанного с потоком при использовании нескольких менеджеров трансакций

Важные фрагменты являются следующие:

<tx:annotation-driven /> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="SessionFactory" /> 
</bean> 

<bean id="txManagerRead" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="SessionFactory" /> 
    <qualifier value="READ"/> 
</bean> 

<bean id="txManagerWrite" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="SessionFactory1" /> 
    <qualifier value="WRITE"/> 
</bean> 

<bean id="AbstractSessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
    abstract="true"> 
    <property name="annotatedClasses"> 
     <list> 
..... 
.... 
     </list> 
    </property> 
    <property name="exposeTransactionAwareSessionFactory"> 
     <value>true</value> 
    </property> 
</bean> 

<bean id="SessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
    parent="AbstractSessionFactory"> 
    <property name="hibernateProperties"> 
     <props> 
......... 
......... 
</props> 
</property> 
</bean> 



<bean id="SessionFactory1" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" 
    parent="AbstractSessionFactory"> 
    <property name="hibernateProperties"> 
     <props> 
......... 
......... 
</props> 
</property> 
</bean> 

я получаю следующее исключение:

Caused by: org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 

    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 

    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:574) 

    at com.amazon.im.dao.hibernate.GenericDAOImpl.getSession(GenericDAOImpl.java:53) 

    at com.amazon.im.dao.hibernate.CategoryDAOImpl.findAllActiveCategories(CategoryDAOImpl.java:54) 

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

метод, который вызывает DAO следующим образом:

@Transactional(rollbackFor = { DependencyException.class, ServiceException.class }, readOnly = true, value="READ") 
@Operation("getActiveCategories") 
public GetActiveCategoriesResponse getActiveCategories() throws ServiceException, DependencyException 
{ ..... 
...... 
...... 
} 

Может кто-нибудь мне точку что я делаю неправильно?

+0

Я совершенно не вижу смысла делать это? Почему у 2 (и даже 3) разных ТМ? Что произойдет, если метод чтения и записи хочет вызвать метод чтения? –

+0

@ JB: Предположим, что метод чтения и записи будет вызывать метод записи только. Причина наличия 2 ТМ (третий по умолчанию один) - наличие аннотации Transactional для каждого API, который создает сеанс в начале, который используется для последующих вызовов DAO. – instanceOfObject

+0

Я понимаю это. Но что вы получаете за одну единую ТМ, используемую для всех операций, за исключением ненужной сложности? Стандартный способ - это иметь одну ТМ. Нет необходимости в нескольких. –

ответ

2

Попробуйте использовать @Transactional ("Tx_Manager_Name") согласно this. Ваша конфигурация кажется правильной, так как несколько менеджеров Txn поддерживаются также с помощью Qualifiers.

+0

Спасибо Aravind. Но, я думаю, этот код делает именно то, что вы сказали. @Transactional (rollbackFor = {DependencyException.class, ServiceException.class}, readOnly = true, value = "READ"). Дайте мне знать, если есть какая-то разница. «READ» - это имя TX_MANAGER. – instanceOfObject

+1

@tyro - я продублировал всю вашу конфигурацию и не нашел никакой проблемы. Я подозреваю, что может возникнуть проблема в слое Dao - Инъекция фабрики сеансов или что-то в этом роде. Или, может быть, вы выполняете поиск вне транзакции. –

+0

Да. Я сделал ошибку :( был прокомментирован. Большое спасибо за вашу помощь :) – instanceOfObject

2

Ваша конфигурация неверна. Спящий режим и даже весна позволяют создавать только одну фабрику сеансов для каждого приложения. Посмотрите эту ссылку: Spring + Hibernate session lifecycle. Вы можете создать сеанс для каждой транзакции.

Также проверьте эту ссылку: http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html

+0

org.hibernate.HibernateException: No Hibernate Session связанный с потоком, а конфигурация не позволяет создать не транзакционную (sessionfactory) здесь –

+0

, не уверен, что это правильно. Я создал несколько приложений, которые используют несколько сессионных фабрик, по одному на 'dataSource'. Конечно, под капотом Hibernate может повторно использовать один и тот же «SessionFactory» для создания новых сеансов (например, что делает EhCache с помощью 'CacheManager' и кешей). – atrain

+0

Да! это может быть. Если вы используете несколько источников данных, вы можете создать sessionfactory для каждого источника данных. Но @tyro использует один источник данных для двух (чтение и запись) sessionFactories, и это невозможно. –

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