2012-01-05 47 views
1

我創建了兩個事務管理器(一個用於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 
{ ..... 
...... 
...... 
} 

任何人都可以點我我做錯的部分?

+0

我完全沒有看到這樣做的重點嗎?爲什麼有2個(甚至3個)不同的TM?如果讀寫方法想要調用讀方法會發生什麼? – 2012-01-05 15:58:16

+0

@JB:截至目前,假設讀寫方法只會調用寫入方法。 有2個TM(第三個是默認的)的原因是每個API的交易註釋的存在,它在開始時創建一個會話,用於後續的DAO調用。 – instanceOfObject 2012-01-05 16:05:22

+0

我明白。但是,除了不必要的複雜性之外,對於所有操作而言,您獲得的優於1個單獨的TM是什標準的做法是有一個TM。不需要幾個。 – 2012-01-05 16:15:02

回答

2

按照this嘗試使用@Transactional(「Tx_Manager_Name」)。您的配置似乎是正確的,因爲通過限定符也支持多個Txn管理器。

+0

感謝Aravind。但是,我認爲這段代碼正在做你剛剛說的話。 @Transactional(rollbackFor = {DependencyException.class,ServiceException.class},readOnly = true,value =「READ」)。讓我知道是否有任何區別。 「READ」是TX_MANAGER的名稱。 – instanceOfObject 2012-01-05 18:43:28

+1

@tyro - 我重複了您的整個配置,但沒有發現任何問題。我懷疑道層可能存在問題 - 注入會話工廠或其他東西。或者你可能在交易之外進行查詢。 – 2012-01-06 06:47:45

+0

是的。我犯了一個錯誤:(被評論了。 非常感謝您的幫助:) – instanceOfObject 2012-01-06 06:53:02

2

您的配置錯誤。休眠,甚至春天允許您創建每個應用程序只有一個會話工廠。看看這個鏈接:Spring + Hibernate session lifecycle。您可以創建每個事務的會話。

另請查看此鏈接:http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/SessionFactory.html

+0

org.hibernate.HibernateException:沒有Hibernate會話綁定到線程,並且配置不允許在這裏創建非事務性(sessionfactory) – 2012-01-05 19:36:50

+0

不確定這是否正確。我已經構建了多個使用多個會話工廠的應用程序,每個'dataSource'一個。當然,在底層,Hibernate可能會重複使用相同的SessionFactory來創建新的會話(比如EhCache用'CacheManager'和緩存進行的操作)。 – atrain 2012-01-06 13:59:25

+0

是啊!那可以。如果您使用多個數據源,則可以爲每個數據源創建sessionfactory。但@tyro使用單個數據源進行兩個(讀寫)sessionFactory,這是不可能的。 – 2012-01-06 14:27:41

相關問題