Jsf 如何在RequestScope视图上更新数据库中的bean?

Jsf 如何在RequestScope视图上更新数据库中的bean?,jsf,primefaces,Jsf,Primefaces,首先,对不起我的英语。我有一个RequestScoped ManagedBean,以便向其他视图发送参数,而不必获取表达式引用的对象的范围比引用托管bean的错误短。在相同的RequestScope视图中,我还有一个p:dataTable,其中显示了这些bean对象,每行都有一个更新按钮,它将这个bean检索到同一视图中的另一个表单,并使用新值进行更新 问题是,当我点击submit按钮记录新值时,会创建另一条记录,而不是更新旧记录。当然,因为当按下submit按钮RequestScope时,be

首先,对不起我的英语。我有一个RequestScoped ManagedBean,以便向其他视图发送参数,而不必获取表达式引用的对象的范围比引用托管bean的错误短。在相同的RequestScope视图中,我还有一个p:dataTable,其中显示了这些bean对象,每行都有一个更新按钮,它将这个bean检索到同一视图中的另一个表单,并使用新值进行更新

问题是,当我点击submit按钮记录新值时,会创建另一条记录,而不是更新旧记录。当然,因为当按下submit按钮RequestScope时,bean被终止,在DB中创建一个新bean和另一条记录。我如何在这个范围内修复它

我见过一些使用@PostConstruct的替代方案,但是我不完全确定它是否能解决我的具体问题

编辑:

在进一步研究之后,我遇到了另一个疑问:我在两个视图中使用的是相同的Bean在我的案例中,ProjectBean,我是否应该创建一个带有RequestScope注释的新Bean,比如ProjectDBean,将旧的设置为ViewScope,这样我就可以在我的数据库上自然地复制更新,让这个新Bean处理其他视图的请求

提交按钮:

“重力”法:

    public void gravar() {
    System.out.println("Gravando projeto " + this.projeto.getNome());

    ProjetoDAO dao = new ProjetoDAO();

    if (this.projeto.getId() == null) {
        dao.adiciona(this.projeto);
        projetosAtivos = this.getProjetosAtivos();
    } else {
        dao.atualiza(this.projeto);
    }

    this.projeto = new Projeto();
}

您可以使用请求范围的支持bean来更新实体。问题是,请求生命周期在呈现页面时结束。因此,您加载的任何内容都将被丢弃。submit创建另一个请求,该请求将尝试重新加载资源,但它与前一个请求不同,例如请求参数通常不包含程序员期望的内容。但这是你已经发现的。有两种方法可以解决这个问题:

1使用简单的getter和setter来设置请求范围bean中的字符串、整数和类似变量,这些变量用于重构和修改要更新的实体。这对程序员来说并不方便,但请求范围的bean可以节省服务器的资源

2更改支持bean的范围。会话范围并不理想,因为它可以在内存中保留很长时间。您可能会意识到需要手动清理它。ViewScopedBean更好,因为它允许您使用通过几个步骤加载的实体。当用户离开页面时,它将被清除

@javax.faces.bean.ViewScoped
@javax.faces.bean.ManagedBean
public class SomethingBean {
    ......
}

你能把提交按钮的代码放在这里吗?给你,谢谢你的关注。这里还有其他有用的代码片段吗?你试过你说的建议了吗?要将bean分成具有不同作用域的两个bean?i、 实际上,我删除了导致OP中提到的错误的注释,并将ProjetoBean的范围设置为SessionScoped,将相同的bean保留到下一页。这并不总是一件好事,但在我的情况下,这很好,因为我不会有其他项目的其他页面。谢谢你抽出时间,奥马尔。好吧。不客气。