【问题标题】:How to get transactions to a @PostConstruct CDI bean method如何将事务获取到@PostConstruct CDI bean 方法
【发布时间】:2013-11-21 12:00:57
【问题描述】:

我正在试验 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 初始化方法?

【问题讨论】:

  • 为什么说它只适用于EJB? Java EE 7 还添加了对 CDI 的 @Transactional 支持,将事务转移到自己的规范中。
  • 您对常规方法是正确的,但由于某种原因,它似乎不适用于 @PostConstruct 初始化方法。做一些需要事务的与数据库相关的初始化工作似乎是一个自然的地方。也许还有其他方法可以做这种事情?
  • 这听起来像是你的应用服务器中的一个错误。你用的是什么应用服务器?
  • 忘了说,它的 GlassFish Server Open Source Edition 4.0 (build 89)
  • 确认尝试调用 EJB 以通过 CDI bean 中的 postConstruct() 方法对数据库进行持久化或执行任何操作不起作用。我也在使用 GlassFish Server 4.0

标签: java jakarta-ee jpa transactions cdi


【解决方案1】:

显然是这样的:

在@PostConstruct 中(与 InitializingBean 接口中的 afterPropertiesSet 一样) 没有办法确保所有的后期处理都已经完成,所以(确实)那里 可以没有交易。确保其正常工作的唯一方法是使用 交易模板。

因此,从@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

【讨论】:

  • 在具有应用程序范围的托管 bean 中,@ManagedBean(eager = true) 查询和持久化似乎适用于 EclipseLink 2.4.2,但不适用于 Hibernate 5.2.10.Final(导致 LazyInitializationException)。
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 2013-05-23
相关资源
最近更新 更多