示例:
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
会话bean,如下所示吗?
@Stateful
@DeclareRoles(value={"ROLE_ADMIN", "ROLE_USER"})
@RolesAllowed(value={"ROLE_ADMIN"})
public class ZoneBean implements ZoneBeanRemote
{
@Inject
private EntityManager entityManager;
//...
}
另一件事:是否有必要在这里处理交易,比如在某个时间关闭EntityManager
?
甚至,在这种情况下需要@TransactionAttribute
EJB之上的注释EntityManagerProducer
或者这只是一个缺陷,需要重新考虑(我假设,因为EJB使用容器管理的事务,这应该不需要)?
如果这种方法不合适,将EntityManager
作为CDI bean公开的一般惯例是什么?
我目前正在使用GlassFish Server 4.1。