Использование EntityManager, уже созданного с помощью @Transactional DeltaSpike

Я пытаюсь использовать @Transactional библиотекой DeltaSpike, но у меня есть некоторые проблемы с ним. Давайте посмотрим:

1) у меня есть источник DAO, который создает EntityManager с помощью пользовательского квалификатора.

@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;

Источник вызывается и EntityManager создается с помощью myPU01. Но внутри класса DAO у меня есть метод save, и я хотел бы использовать @Transactional из DeltaSpike lib:

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

Проблема живет здесь. @Transactional попытается создать другой EntityManager, но у меня уже есть EntityManager, созданный с помощью myPU01. Я не могу поставить persistenceUnitName рядом с «save».

1 ответ

  1. Вам нужен собственный производитель для Entity-Manager (с полезной областью, например @TransactionScoped). Внедрите этот Entity-Manager в бобы, а также В метод Producer-для DAO (в качестве параметра).
    Это правила для CDI и no issue / limitation/… DeltaSpike.