注入/公开EntityManager作为CDI bean

时间:2014-10-20 18:30:06

标签: java-ee glassfish ejb glassfish-4 java-ee-7

示例:

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。

0 个答案:

没有答案