我对JPA中的容器管理事务有一些疑问。例如,我有一个带有托管bean的JSF页面,它调用了一个会话bean的方法:
@ManagedBean
@RequestScoped
public class TestController {
@EJB
private TestBean bean;
public String action() {
bean.check();
return null;
}
}
@Stateful
@LocalBean
public class TestBean {
@PersistenceContext
private EntityManager em;
public Object check() {
return em.createQuery("SELECT u from User u WHERE u.id = 1").getSingleResult();
}
}
我是否理解正确,如果在同一事务中调用check()
方法,则EntityManagers
将具有相同的持久性上下文,并且该方法将一遍又一遍地返回相同的Object
?
如果控制器的action()方法有多个请求,EntityManagers
每个请求会有不同的持久化上下文吗?
它取决于会话bean的类型:有状态还是无状态?
如果我将控制器的范围更改为@SessionScoped
并从同一会话创建多个请求,该怎么办?
通常,是否有任何规则定义容器何时创建新事务?它取决于容器类型(我正在使用Glassfish)吗?