Это мой первый раз, когда я пытаюсь использовать Spring3 @Scheduled , но обнаружил, что не могу зафиксировать в БД. Это мой код:
@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);
}
}
Я думаю, что это должно работать, я вижу, что он запускается ежечасно и загружает xxx из БД, но данные не фиксируются в БД.
В весеннем 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" />
Может кто-нибудь сказать мне, что я пропустил здесь?
У меня есть одно "грязное" решение:
@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);
}
});
}
}
Здесь он отлично работает , но он настолько избыточен , что затрудняет чтение кода. Интересно, почему TransactionManager не внедряется (и не открывается) в предыдущих фрагментах кода?
Большое спасибо !
rollbackFor
для@Transactional
не нужен. Откат всегда выполняется неявно для исключений во время выполнения. - person Piotr Findeisen   schedule 26.03.2011