如何获取@PostConstruct CDI bean方法的事务

时间:2013-11-09 13:41:19

标签: java java-ee jpa transactions cdi

我正在尝试使用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-e-g-in-jboss-7-0-2/

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

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

1 个答案:

答案 0 :(得分: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
            }
        });
   }
}

注意:类似的线程但引用Spring框架@Transactional on @PostConstruct method