正如博客/书籍中提到的那样(例如Mark Richards的Java Transactions Design Strategies),读取操作必须具有Propagation.SUPPORTS属性。
在一个带有Hibernate 4.1的简单Spring 3.1 MVC项目中,场景是:
当然,当Controller执行读取操作的功能时,会引发异常“找不到当前线程的会话”,因为没有启动事务并且没有获得会话。
基于上述配置(尽管最好是非侵入性的,更少的代码等),除非在使用Propagation.REQUIRED或Propagation.REQUIRES_NEW之前启动事务,否则不能使用Propagation.SUPPORTS属性。
我们如何使用Propagation.SUPPORTS进行读取操作而无需启动事务,例如使用Propagation.REQUIRED但仍然利用声明式事务管理的好处?
提前谢谢。
Coder,这是配置:
<tx:annotation-driven transaction-manager="txManager"/>
<context:component-scan base-package="com.myapps.service.impl" />
<bean id="txManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>.....</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${db.dialect}</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
</bean>
答案 0 :(得分:5)
我不同意使用SUPPORTS进行读取操作。使用必需。
答案 1 :(得分:0)
Propagation.SUPPORTS并不总是需要交易。 Propagation.SUPPORTS:支持当前事务,如果不存在则以非事务方式执行。