Инъекция / экспонирование EntityManager как бина CDI

Пример:

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class EntityManagerProducer
{
    @PersistenceContext
    private EntityManager entityManager;

    @Produces
    @RequestScoped
    public EntityManager getEntityManager() {
        return entityManager;
    }
}

EntityManager теперь может быть введен в другие EJB. Например,

@Stateless
@DeclareRoles(value={"ROLE_ADMIN", "ROLE_USER"})
@RolesAllowed(value={"ROLE_ADMIN"})
public class ZoneBean implements ZoneBeanRemote
{
    @Inject
    private EntityManager entityManager;

    //... This is a remote EJB.
}

Может это EntityManager безопасно впрыскивать в Stateful сессионный компонент вроде как?

@Stateful
@DeclareRoles(value={"ROLE_ADMIN", "ROLE_USER"})
@RolesAllowed(value={"ROLE_ADMIN"})
public class ZoneBean implements ZoneBeanRemote
{
    @Inject
    private EntityManager entityManager;

    //...
}

Другое дело: нужно ли здесь заниматься такими операциями, как закрытие EntityManager в определенное время?

Четная аннотация @TransactionAttribute выше EntityManagerProducer В этом случае нужен EJB, или это всего лишь недостаток, и его необходимо пересмотреть (я полагаю, поскольку в EJB используются транзакции, управляемые контейнером, в этом нет необходимости)?

Каково общее соглашение разоблачения EntityManager как боб CDI, если этот подход не подходит?

Я в настоящее время работаю с GlassFish Server 4.1.

0 ответов

Другие вопросы по тегам