4

我正在试验 Java EE 7、CDI、JPA 和 JSF。

当 webapp 启动时,我想在我的 CDI bean(标有@PostConstruct)中运行一个初始化方法,该方法对数据库进行一些工作(插入一些行等)。为此,我需要一笔交易,但这并不像我预期的那么容易。

我尝试在我的方法中添加 @Transactional 注释,但显然它只适用于 EJB。我实际上尝试将我的 bean 转换为 EJB 而不是 CDI bean,但我仍然没有得到我的 @PostConstruct 方法的事务。它适用于 bean 中的其他方法,但不适用于我的 @PostConstruct 初始化方法。

然后我阅读了有关创建方法拦截器以获取对 CDI bean 的事务的信息:

http://eubauer.de/kingsware/2012/01/16/cdi-and-transactions-eg-in-jboss-7-0-2/

我也试过这个,但没有运气。它也不起作用。

那么如何在 CDI bean 中获取到 @PostConstruct 初始化方法的事务呢?

4

1 回答 1

2

显然,似乎:

在 @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 框架@Transactional

于 2013-12-23T09:08:54.210 回答