我决定使用管理的请求范围容器,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