@PostConstruct方法上的@Transactional
我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。
为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。
我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。
然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。
那我需要手动管理交易吗?
回答:
我想在应用程序开始时阅读文本数据装置(CSV文件),并将其放入数据库中。
为此,我创建了带有初始化方法(@PostConstruct批注)的PopulationService。
我也希望它们在单个事务中执行,因此我在同一方法上添加了@Transactional。
然而,@Transactional似乎被忽略:该交易启动/停止我的低水平DAO方法。
那我需要手动管理交易吗?在@PostConstruct中(与InitializingBean接口中的afterPropertiesSet一样),无法确保已完成所有后期处理,因此(实际上)不能有任何事务。确保工作正常的唯一方法是使用TransactionTemplate。
因此,如果你希望·在事务中执行某些操作,则必须执行以下操作:
@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方法上的@Transactional 的全部内容, 来源链接: utcz.com/qa/427924.html