【问题标题】:Using EntityManager already created with @Transactional DeltaSpike使用已经用 @Transactional DeltaSpike 创建的 EntityManager
【发布时间】:2016-10-04 14:32:42
【问题描述】:

我正在尝试通过 DeltaSpike 库使用 @Transactional,但我遇到了一些问题。让我们看看:

1) 我有一个使用自定义限定符创建 EntityManager 的 DAO 生产者。

@Produces
    @PersistenceUnitName(value="")
    public DAO criar(InjectionPoint ip) {
        String persistenceUnit = "";
        EntityManager em = null;

        for (Annotation annotation : ip.getQualifiers()) {
            if (annotation instanceof PersistenceUnitName) {

                persistenceUnit = ((PersistenceUnitName) annotation).value();
            }
        }
        em = Persistence.createEntityManagerFactory(persistenceUnit).createEntityManager();

        return new DAO(em);
    }

现在假设我在其他类中注入 DAO:

@Inject @PersistenceUnit(value="myPU01")
    private DAO dao;

调用生产者并使用 myPU01 创建 EntityManager。但在 DAO 类中,我有一个方法 save,我想使用 DeltaSpike lib 中的@Transactional:

@Transactional
    public void save(AbstractEntity entidade) {
        em.persist(entidade);
        em.flush();
    }

问题就在这里。 @Transactional 将尝试创建另一个 EntityManager,但我已经使用 myPU01 创建了一个 EntityManager。我不能将 persistenceUnitName 放在“保存”旁边。

【问题讨论】:

  • 为每个创建的对象调用 Persistence.createEntityManagerFactory(persistenceUnit) 似乎是一个非常糟糕的主意。

标签: jpa cdi deltaspike


【解决方案1】:

您需要一个自己的实体管理器生产者(具有有用的范围,例如 @TransactionScoped)。将此 Entity-Manager 注入您的 bean 以及您的 DAO 的 Producer-Method 中(作为参数)。 这是 DeltaSpike 的 CDI 和 no issue/limitation/... 的规则。

【讨论】:

  • 仅供参考:如果您直接询问社区,您会在几个小时内收到答复。
  • 你能给我举个例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2021-03-14
相关资源
最近更新 更多