【问题标题】:Object in list not updating when value changed in primefaces datatable using roweditor使用 roweditor 在 primefaces 数据表中更改值时列表中的对象未更新
【发布时间】:2015-04-18 01:35:48
【问题描述】:

我正在使用 primefaces 数据表和行编辑器来更新数据库。

当我单击行编辑器时,它使列按预期可编辑,我更改了值。

当我单击行编辑器上的接受按钮时,我从事件中获取对象并将其转换为实体并将该对象传递给更新数据库的模型类。

从调试中我发现,当我从 CView Bean 的 onRowEdit 方法中的事件中获取 Project 对象时,我在数据表上的 rowedit 模式下更改的值设置在 Project 实体中,但我从中获得的 Project 对象事件是应用任何更改之前的对象。

换句话说,当我编辑数据表行并更改值时,项目实体会使用更改后的值进行更新,但我从事件中获得的项目对象没有我对数据表所做的更改。

我不知道我遗漏了什么或不理解什么,请帮忙?

下面是关于设置和代码的更多信息

我正在使用 Primefaces 5.1 雄猫 7.0.53 Java EE 7

我的数据表:

        <p:dataTable var="customer" 
                     id="customerdatatable" 
                     style="font-size: 12px;" 
                     value="#{cView.list}"
                     editable="#{cView.modify}"
                     rowKey="#{customer.hashCode}"
                     emptyMessage="No Customers found."
                     widgetVar="custdtwv"
                     scrollable="true"
                     scrollHeight="7%">
            <p:ajax event="rowEdit" 
                    listener="#{cView.onRowEdit}"/>

            <p:column headerText="Customer" 
                      filterBy="#{customer.project}"
                      filterMatchMode="contains">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.project}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.project}" 
                                     style="width:96%;"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Project Code" 
                      filterBy="#{customer.projectCode}"
                      filterMatchMode="contains">
                <h:outputText value="#{customer.projectCode}"/>
            </p:column>

            <p:column headerText="Contact">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.contact}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.contact}" 
                                     style="width:96%;"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Phone">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.phone}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.phone}" 
                                     style="width:96%;"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Email">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.email1}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.email1}" 
                                     style="width:96%;"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>


            <p:column headerText="Address">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{customer.address}"/>
                    </f:facet>
                    <f:facet name="input">
                        <p:inputText value="#{customer.address}" 
                                     style="width:96%;"/>
                    </f:facet>
                </p:cellEditor>
            </p:column>

            <p:column headerText="Action"
                      style="width:32px">
                <p:rowEditor />
            </p:column>
        </p:dataTable>

我的豆子:

@ManagedBean
@ViewScoped
public class CView implements Serializable {

private List<Project> list;

private List<Project> selected = new ArrayList<>();

private List<Project> filtered;

private Model model;

private boolean modify;

@PostConstruct
public void init() {
    model = new Model();

    modify = User.getPermissions().checkPermission(Permissions.CUSTMANAGE);
}

public List<Project> getList() {
    list = model.getList();

    return list;
}

public void setList(List<Project> list) {
    this.list = list;
}

public List<Project> getSelected() {
    return selected;
}

public List<Project> getFiltered() {
    return filtered;
}

public void setSelected(List<Project> selected) {
    this.selected = selected;
}

public void setFiltered(List<Project> filtered) {
    this.filtered = filtered;
}

public Model getModel() {
    return model;
}

public void setModel(Model model) {
    this.model = model;
}

private void update(Project upd) {
    boolean updated = model.updateProject(upd);

    if (updated) {
        Logger.getLogger(this.getClass().getName()).log(Level.INFO,
                "Project [{0}] was updated by {1}: {2}",
                new Object[]{upd.getProjectCode(), User.getFullName(), upd.toString()});

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "CUSTOMER [" + upd.getProjectCode() + "]", "Update successfull."));
    } else {
        Logger.getLogger(this.getClass().getName()).log(Level.SEVERE,
                "Project [{0}] could not be updated by {1}: {2}",
                new Object[]{upd.getProjectCode(), User.getFullName(), upd.toString()});

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "CUSTOMER [" + upd.getProjectCode() + "]", "Could not be updated."));
    }
}

public void onRowEdit(RowEditEvent event) {
    Project updProject = (Project) event.getObject();

    update(updProject);
}

public boolean getModify() {
    return modify;
}

public void setModify(boolean modify) {
    this.modify = modify;
}
}

我的实体:

@Entity
@Table(name = "S_PROJECT")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Project.findAll", query = "SELECT p FROM Project p"),
@NamedQuery(name = "Project.findById", query = "SELECT p FROM Project p WHERE p.id = :id"),
@NamedQuery(name = "Project.findByProject", query = "SELECT p FROM Project p WHERE p.project = :project"),
@NamedQuery(name = "Project.findByType", query = "SELECT p FROM Project p WHERE p.type = :type"),
@NamedQuery(name = "Project.findByProjectCode", query = "SELECT p FROM Project p WHERE p.projectCode = :projectCode"),
@NamedQuery(name = "Project.findByGeo", query = "SELECT p FROM Project p WHERE p.geo = :geo"),
@NamedQuery(name = "Project.findBySelection", query = "SELECT p FROM Project p WHERE p.selection = :selection"),
@NamedQuery(name = "Project.findByLegalName", query = "SELECT p FROM Project p WHERE p.legalName = :legalName"),
@NamedQuery(name = "Project.findByContact", query = "SELECT p FROM Project p WHERE p.contact = :contact"),
@NamedQuery(name = "Project.findByPhone", query = "SELECT p FROM Project p WHERE p.phone = :phone"),
@NamedQuery(name = "Project.findByAddress", query = "SELECT p FROM Project p WHERE p.address = :address"),
@NamedQuery(name = "Project.findByDeliver", query = "SELECT p FROM Project p WHERE p.deliver = :deliver"),
@NamedQuery(name = "Project.findByEmail1", query = "SELECT p FROM Project p WHERE p.email1 = :email1"),
@NamedQuery(name = "Project.findByEmail2", query = "SELECT p FROM Project p WHERE p.email2 = :email2"),
@NamedQuery(name = "Project.updateCustomer", query = "UPDATE Project p SET p.project = :project, p.contact = :contact, p.phone = :phone, p.email1 = :email1, p.address = :address WHERE p.projectCode = :projectCode")})
public class Project implements Serializable {

private static final long serialVersionUID = 123456L;
@Basic(optional = false)
@Column(name = "ID")
private int id;
@Id
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 255)
@Column(name = "Project")
private String project;
@Size(max = 255)
@Column(name = "Type")
private String type;
@Size(max = 255)
@Column(name = "ProjectCode")
private String projectCode;
@Column(name = "Geo")
private Boolean geo;
@Size(max = 255)
@Column(name = "Selection")
private String selection;
@Size(max = 255)
@Column(name = "LegalName")
private String legalName;
@Size(max = 255)
@Column(name = "Contact")
private String contact;
// @Pattern(regexp="^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$", message="Invalid phone/fax format, should be as xxx-xxx-xxxx")//if the field contains phone or fax number consider using this annotation to enforce field validation
@Size(max = 255)
@Column(name = "Phone")
private String phone;
@Size(max = 255)
@Column(name = "Address")
private String address;
@Size(max = 255)
@Column(name = "Deliver")
private String deliver;
@Size(max = 255)
@Column(name = "Email1")
private String email1;
@Size(max = 255)
@Column(name = "Email2")
private String email2;

public Project() {
}

public Project(String project) {
    this.project = project;
}

public Project(String project, int id) {
    this.project = project;
    this.id = id;
}
//Getters and Setters

@Override
public int hashCode() {
    int hash = 0;

    hash += (project != null ? project.hashCode() : 0);

    return hash;
}

@Override
public boolean equals(Object object) {
    if (!(object instanceof Project)) {
        return false;
    }

    Project other = (Project) object;

    if ((this.project == null && other.project != null) || (this.project != null && !this.project.equals(other.project))) {
        return false;
    }

    return true;
}

@Override
public String toString() {
    return "za.co.xon.intranet.customer.Project[id=" + id
            + "] projectcode=[" + projectCode + "] contact=[" + contact
            + "] phone=[" + phone + "] email1=[" + email1 + "] address=[" + address + "]";
}
}

【问题讨论】:

  • 表单组件是否会更改以反映更新?您应该 ajax 刷新表格
  • @kolossus,感谢您的回复,我发现了这个问题,这有点烦人,但是在我的 bean 中的 getList() 方法中,我每次刷新表时都会重新创建列表,我将列表的创建移至 init() 方法,更新工作正常。

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

我发现了这个问题,这有点烦人,但是每次需要调用列表时,我的 bean 中的 getList() 方法都会重新创建列表,只要我将列表的创建移动到 init() 方法更新工作正常。

【讨论】:

  • 我同意这很烦人,但完全有道理。我遇到了同样的问题,现在感谢您的评论,它工作正常。现在我想知道是否有办法减少对后端的请求数。
【解决方案2】:

尝试在&lt;p:ajax&gt; 标签中使用process="customerdatatable" 来强制更新值:

<p:ajax event="rowEdit" 
        listener="#{cView.onRowEdit}"
        process="customerdatatable"/>

【讨论】:

  • 不幸的是,这并没有解决我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多