【发布时间】:2017-03-06 02:10:42
【问题描述】:
假设我有下一个代码:
@Autowired
private IManager1 manager1;
@Autowired
private IManager2 manager2;
@Autowired
private IManager3 manager3;
@Transactional
public void run() {
manager1.doStuff();
manager2.registerStuffDone();
manager3.doStuff();
manager2.registerStuffDone();
manager1.doMoreStuff();
manager2.registerStuffDone();
}
如果出现任何异常,我想回滚“doStuff()”方法所做的一切,但我不想回滚“registerStuffDone()”方法记录的数据。
我一直在阅读@Transactional注解的传播选项,但我不明白如何正确使用它们。
每个经理在内部都使用 hiberante 来提交更改:
@Autowired
private IManager1Dao manager1Dao;
@Transactional
public void doStuff() {
manager1Dao.doStuff();
}
道看起来像这样:
@PersistenceContext
protected EntityManager entityManager;
public void doStuff() {
MyObject whatever = doThings();
entityManager.merge(whatever);
}
这是我的 applicationContext 配置:
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSourcePool" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
</property>
</bean>
<bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
想法?
【问题讨论】: