我想從舊式的TransactionProxyFactoryBean事務管理遷移到春季推薦的聲明式事務管理。 這樣就可以避免不時出現的交易出現異常情況。從TransactionProxyFactoryBean到聲明式事務管理?
這是我的XML配置文件:
<beans xmlns=...>
<context:annotation-config/>
<context:component-scan base-package="prof" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>WEB-INF/classes/hibernate.cfg.xml</value>
</property>
</bean>
<import resource="prof-dao-spring.xml" />
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="save*">PROPAGATION_REQUIRED</prop>
...
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="ProfileService" parent="baseTransactionProxy">
<property name="target">
<bean class="tv.clever.hibernate.service.ProfileService"></bean>
</property>
</bean>
</beans>
ProfileService
的樣子:
@Component
public class ProfileService {
@Autowired
@Qualifier("baseDAO")
protected BaseDAO baseDAO;
private static ProfileService profileService;
public ProfileService() {
setProfileService(this);
}
public void setProfileService(ProfileService ps) {
profileService = ps;
}
public void save(final Collection transientObjects) {
baseDAO.save(transientObjects);
}
...
}
從哪裏我要開始?
你想做什麼?使用註釋,即'@ Transactional'?還是仍然在使用XML?小技巧而不是'@ Component'我會建議使用'@ Service'來爲你的daos標記你的服務類和'@ Repository'。什麼是爲自己設置一個靜態引用的裝置,這會讓我的警鐘響起......您當前的設置也複製了所有的豆子?你有組件掃描和手動配置,你基本上爲每個bean創建2個實例(不包括代理)。 –
是的,我想要一個'Annotation style transaction'就像這個例子(1. Annotation style transaction):http://simplespringtutorial.com/springDeclarativeTransactions.html區別在於我使用Hibernate框架'HibernateTransactionManager' – Dylan
哪個事務管理器沒關係。 –