1

我决定使用管理的请求范围容器,EntityManager并为此创建了一个生产者:

@RequestScoped
public class EntityManagerProducer {
    @PersistenceContext(unitName = "PU", type = PersistenceContextType.TRANSACTION)
    private EntityManager entityManager;

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

我有两个公开远程客户端视图的 EJB:

@Remote
public interface EJB1 {
    void createPerson(int id, String firstName, String lastName);
}

@Remote
public interface EJB2 {
    void containsEntity(Person person);
}

@Stateless
public class EJB1Impl implements EJB1 {
    @Inject
    private EntityManager entityManager;

    @EJB
    private EJB2 ejb2;

    @Override
    public void createPerson(final int id, final String firstName, final String lastName) {
        Person person = new Person();
        person.setId(id);
        person.setFirstName(firstName);
        person.setLastName(lastName);
        entityManager.persist(person);
        System.out.println("EJB1Impl: persistence context contains entity: " + entityManager.contains(person));
        ejb2.containsEntity(person);
    }
}

@Stateless
public class EJB2Impl implements EJB2 {
    @Inject
    private EntityManager entityManager;

    @Override
    public void containsEntity(final Person person) {
        System.out.println("EJB2Impl: PersistenceContext contains entity: " + entityManager.contains(entity));
        person.setLastName("new name");
        //entityManager.merge(person);
    }
}

EJB 部署在 WildFly 10 上。我使用本教程通过远程客户端访问它们。当前版本抛出此异常:org.jboss.weld.context.ContextNotActiveException: WELD-001303 No active contexts for scope type javax.enterprise.context.RequestScoped. 如果我@RequestScoped从生产者那里删除注释,我不会得到异常,但是当询问它是否包含实体以及我是否希望对实体所做的更改(姓氏的更改)时,EntityManager注入到第二个EJB返回false任何效果,我都必须调用entityManager.merge(person),这显然意味着实体已分离。我确定第二个EJB使用相同的事务执行,因为如果我注入一个EJBContext并调用setRollbackOnly()启动的事务EJB1将回滚,并且不会将新人插入数据库。

的文档javax.enterprise.context.RequestScoped说请求范围在 any 的任何远程方法调用期间都是活动的EJB,那么给出了什么?如何EntityManager在多个请求期间共享一个EJB's

4

0 回答 0