@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 .. } } 

有关更多详细信息,请参阅文档部分标准和自定义事件