1

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

4

0 回答 0