使用已使用@Transactional DeltaSpike创建的EntityManager

时间:2016-10-04 14:32:42

标签: jpa cdi deltaspike

我正在尝试使用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类里面我有一个方法保存,我想使用DeltaSpike lib中的@Transactional:

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

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

1 个答案:

答案 0 :(得分:0)

您需要一个自己的Entity-Manager生产者(具有有用的范围,例如@TransactionScoped)。在您的bean中以及DAO的Producer-Method中注入此Entity-Manager(作为参数)。 这是DeltaSpike的CDI和 no 问题/限制/ ...的规则。