我对 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)?