Нет сеанса Hibernate, привязанного к потоку при использовании нескольких менеджеров переходов - PullRequest
1 голос
/ 05 января 2012

Я создал два менеджера транзакций (один для запросов READ и другой для запросов READ-WRITE) и две фабрики сеансов для одного и того же.

Ниже приведены важные фрагменты:

<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
{ .....
......
......
}

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

Ответы [ 2 ]

2 голосов
/ 05 января 2012

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

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

2 голосов
/ 05 января 2012

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

...