【发布时间】:2011-07-23 13:36:15
【问题描述】:
这是我第一次尝试 Spring3 的 @Scheduled ,但发现我无法提交到 DB。这是我的代码:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
// get xxx from dao , modify it
dao.update(xxx);
}
}
我认为它应该可以工作,我可以看到它每小时启动并从 DB 加载 xxx,但数据没有提交到 DB。
spring 的 xml 中有 tx:annotation-driven:
<bean id="entityManagerFactoryApp" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp"/>
</bean>
<bean id="transactionManagerApp" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactoryApp" />
</bean>
<tx:annotation-driven transaction-manager="transactionManagerApp" />
谁能告诉我我在这里错过了什么?
我有一个“dirty”解决方案:
@Service
public class ServiceImpl implements Service , Serializable
{
@Inject
private Dao dao;
@Inject
@Qualifier("transactionManagerApp")
private PlatformTransactionManager txMgrApp;
@Override
@Scheduled(cron="0 0 * * * ?")
@Transactional(rollbackFor=Exception.class)
public void hourly()
{
final TransactionTemplate txTemplateApp = new TransactionTemplate(txMgrApp);
txTemplateApp.execute(new TransactionCallbackWithoutResult()
{
@Override
protected void doInTransactionWithoutResult(TransactionStatus status)
{
//get xxx from dao
dao.update(xxx);
}
});
}
}
这里工作正常,但它太多余了,使代码更难阅读。 不知道为什么在之前的代码sn-ps中TransactionManager没有被注入(并被打开)?
非常感谢!
【问题讨论】:
-
有点跑题了,但对于
@Transactional,您不需要rollbackFor。对于运行时异常,总是隐式进行回滚。 -
我尝试了你的肮脏解决方案,但它不起作用。知道为什么吗?
标签: spring dependency-injection scheduling transactional spring-3