Jsf 如何获取实体的当前状态,该实体已作为参数通过EL传递给视图范围管理的bean方法?

Jsf 如何获取实体的当前状态,该实体已作为参数通过EL传递给视图范围管理的bean方法?,jsf,jpa,Jsf,Jpa,我需要更新托管bean中的一个实体。我想通过使用MethodExpression、action或actionListener将这个实体传递给托管bean中的一个方法来实现这一点,这似乎是最简单、最清晰的方法。我希望托管bean具有视图范围,因为我使用的是Primefaces的dataTable,当我将其更改为请求范围时,它似乎没有调用action方法,而只是我的preRenderView侦听器 <h:commandXXXX action="#{bean.method(entity)}"&g

我需要更新托管bean中的一个实体。我想通过使用MethodExpression、action或actionListener将这个实体传递给托管bean中的一个方法来实现这一点,这似乎是最简单、最清晰的方法。我希望托管bean具有视图范围,因为我使用的是Primefaces的dataTable,当我将其更改为请求范围时,它似乎没有调用action方法,而只是我的preRenderView侦听器

<h:commandXXXX action="#{bean.method(entity)}">

@ManagedBean(name="bean")
@ViewScoped
class Bean {
    public void method(Entity entity) {
        // ...
    }
}

有更好的方法吗?如果我将bean更改为请求范围(假设我能够使其与dataTable一起工作),那么我会拥有实体的最新状态吗?

您可以将您的实体放在应用程序范围中我承认我只是从DB更新:-但是您可能会创建另一个EJB层来保存连接到持久性上下文的实体。在这种情况下,您需要正确地设计事务。这不一定是JSF/Web应用程序的问题。管理对单个实体的并发访问超越了web应用程序,进入了数据层。不要将该实体或任何实体放在应用程序范围内。这是一个并发问题,对此您有一些非常有趣的答案。一个非常简单的解决方案是在实体中添加一列,并在保存之前检查它是否已更改。如果是,则拒绝保存。
public void method(Entity entity) {
    entity = entityDAO.findById(entity.getId());
}