【发布时间】:2012-02-03 10:43:51
【问题描述】:
我创建了两个事务管理器(一个用于 READ 请求,另一个用于 READ-WRITE 请求)和两个会话工厂。
重要的sn-ps如下:
<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 个(甚至 3 个)不同的 TM?如果一个读写方法想调用一个读方法会发生什么?
-
@JB:到目前为止,假设 read-write 方法只会调用 write 方法。拥有 2 个 TM(第 3 个是默认值)的原因是每个 API 都存在事务注释,该注释在开始时创建一个会话,用于后续 DAO 调用。
-
我明白这一点。但是,除了不必要的复杂性之外,您从 1 个用于所有操作的单个 TM 中获得了什么?标准的做法是拥有一个 TM。不需要几个。
-
我们不想使用这里解释的 ThreadLocal 变量 - blog.springsource.org/2007/01/23/dynamic-datasource-routing。有没有更好的办法?
-
@tyro 我在我的应用程序中使用 CustomRoutingDataSource ,我不喜欢使用 ThreadLocal 变量并每次都设置 CustomRoutingDataSource ,因此我将其设为会话 bean 。除此之外,您还可以进行程序化 Txn 管理。
标签: java hibernate spring sessionfactory transactionmanager