Инъекция / экспонирование 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.