@PostConstruct方法上的@Transactional
我想在我的应用程序的开始读取文本数据灯具 (CSV文件),并将其放入我的数据库。
为此,我使用初始化方法( @PostConstruct注释)创build了一个PopulationService 。
我也希望它们在一个事务中被执行,因此我在同一个方法中添加了@Transactional 。
但是,@Transactional似乎被忽略了:事务在我的低级DAO方法中被启动/停止。
我需要手动pipe理交易吗?
这可能是有帮助的( http://forum.springsource.org/showthread.php?58337-No-transaction-in-transactional-service-called-from-PostConstruct ):
在@PostConstruct(与InitializingBean接口中的afterPropertiesSet一样),没有办法确保所有的后处理已经完成,所以(确实)不会有事务。 确保工作的唯一方法是使用TransactionTemplate。
所以如果你想在你的@PostConstruct
中执行一些事务,你必须这样做:
@Service("something") public class Something { @Autowired @Qualifier("transactionManager") protected PlatformTransactionManager txManager; @PostConstruct private void init(){ TransactionTemplate tmpl = new TransactionTemplate(txManager); tmpl.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { //PUT YOUR CALL TO SERVICE HERE } }); } }
我认为@PostConstruct
只确保当前类的预处理/注入完成。 这并不意味着整个应用程序上下文的初始化完成。
但是,当应用程序上下文的初始化完成时,您可以使用spring事件系统来接收事件:
public class MyApplicationListener implements ApplicationListener<ContextRefreshedEvent> { public void onApplicationEvent(ContextRefreshedEvent event) { // do startup code .. } }
有关更多详细信息,请参阅文档部分标准和自定义事件