当前位置: 首页 > 知识库问答 >
问题:

Primefaces数据表丢失数据

金正阳
2023-03-14

我对使用PrimeFaces 3.4.1和JSF 2.1.6的dataTable有以下问题。第一次加载页面时,数据表中充满了数据库中的数据,但每当在页面上执行操作(编辑链接、数据表排序或过滤)时,数据表就会丢失其数据。DataTable包含来自此类的元素:

package es.cne.sicbios.entities.tramites.envios;

import java.io.Serializable;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataContactoEconomico;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataEmpresaFilial;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataHistoricoTipoSujeto;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataPersonaContacto;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataPlantaProduccion;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataRepresentante;
import es.cne.sicbios.entities.tramites.envios.sujeto.data.EnvioDataSujeto;
import es.cne.sicbios.entities.tramites.solicitudes.SolicitudSujeto;

@SuppressWarnings("serial")
@Entity
public class EnvioSujeto extends Envio implements Serializable{

@ManyToOne(optional = false, cascade = CascadeType.ALL)
private SolicitudSujeto solicitud;

@OneToOne(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private EnvioDataContactoEconomico envioDataContactoEconomico;

@OneToMany(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private List<EnvioDataEmpresaFilial> enviosDataEmpresaFilial;

@OneToMany(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private List<EnvioDataHistoricoTipoSujeto> enviosDataHistoricoTipoSujeto;

@OneToMany(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private List<EnvioDataPlantaProduccion> enviosDataPlantaProduccion;

@OneToOne(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private EnvioDataSujeto envioDataSujeto;

@OneToMany(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private List<EnvioDataPersonaContacto> enviosDataPersonaContacto;

@OneToMany(mappedBy = "envioSujeto", cascade = CascadeType.ALL)
private List<EnvioDataRepresentante> enviosDataRepresentante;

public SolicitudSujeto getSolicitud() {
    return solicitud;
}

public void setSolicitud(final SolicitudSujeto solicitud) {
    this.solicitud = solicitud;
}

... //rest of getters and setters
}

在dataTable上执行操作后进行调试时,我们只在envioDatasujeto字段上保留数据,元素上的其他所有数据都会丢失。

这是xhtml:

<ui:composition template="/templates/layout.xhtml"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:blb="http://ecb.bilbomatica.es/components">

    <ui:define name="content">
        <f:loadBundle basename="es.cne.sicbios.gestionsujetos" var="gestionmsg" />
        <h:form id="formulario">
            <p:messages id="messages" showDetail="true" autoUpdate="true"
                closable="true" />

                <p:dataTable var="envioSujeto"
                value="#{listadoEnviosSujetoMB.lazyListaAllEnvios}" 
                paginator="true" rows="10"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="5,10,15"               
                selectionMode="single"  
                selection="#{listadoEnviosSujetoMB.envioSeleccionado}" 
                id="listaEnviosSujetos" 
                lazy="true">

                <f:facet name="header">  
                    #{gestionmsg.txt_listadoEnviosSujetos} 
                </f:facet>

                <p:column sortBy="#{envioSujeto.envioDataSujeto.datosSujeto.acronimo}" headerText="#{gestionmsg.column_acronimo}"
                    filterBy="#{envioSujeto.envioDataSujeto.datosSujeto.acronimo}">
                    <h:outputText value="#{envioSujeto.envioDataSujeto.datosSujeto.acronimo}" />                    
                </p:column>

                <p:column sortBy="#{envioSujeto.solicitud.id}"
                    headerText="#{gestionmsg.column_id_tramite}"
                    filterBy="#{envioSujeto.solicitud.id}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.solicitud.id}" />                    
                </p:column>

                <p:column sortBy="#{envioSujeto.fechaCreacion.time}"
                    headerText="#{gestionmsg.column_fechaCreacion}"
                    filterBy="#{envioSujeto.fechaCreacion.time}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.fechaCreacion.time}" >
                        <f:convertDateTime pattern="dd/mm/yyyy"/>
                    </h:outputText>
                </p:column>

                <p:column sortBy="#{envioSujeto.tipo}"
                    headerText="#{gestionmsg.column_tipoEnvio}"
                    filterBy="#{envioSujeto.tipo}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.tipo}" />
                </p:column>

                <p:column sortBy="#{envioSujeto.solicitud.estado}"
                    headerText="#{gestionmsg.column_estado}"
                    filterBy="#{envioSujeto.solicitud.estado}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.solicitud.estado}" />
                </p:column>

                <p:column sortBy="#{envioSujeto.idRegistro}"
                    headerText="#{gestionmsg.column_idRegistro}"
                    filterBy="#{envioSujeto.idRegistro}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.idRegistro}" />
                </p:column>

                <p:column sortBy="#{envioSujeto.id}"
                    headerText="id"
                    filterBy="#{envioSujeto.id}"
                    filterMatchMode="contains">
                    <h:outputText value="#{envioSujeto.id}" />
                </p:column>
                <ui:remove>
                <!-- 
                <p:column 
                    headerText="#{gestionmsg.column_bloqueo}"
                    >
                    <h:outputText value="" />
                </p:column>
                 -->
                 </ui:remove>

            </p:dataTable>

            <p:commandLink icon="ui-icon-pencil"
                update=":formulario"
                actionListener="#{listadoEnviosSujetoMB.goToEditarEnvio}"  >    
                <h:outputText value="Editar" />                                         
            </p:commandLink>
        </h:form>
    </ui:define>
</ui:composition>

以及它的托管bean:

package es.cne.sicbios.managedbean.gestionsujetos;

import java.io.Serializable;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import es.cne.sicbios.entities.tramites.envios.Envio;
import es.cne.sicbios.services.tramites.envios.IEnvioService;
import es.cne.sicbios.utils.FacesUtils;

@SuppressWarnings("serial")
@ViewScoped
@ManagedBean(name = "listadoEnviosSujetoMB")
public class ListadoEnviosSujetoMB implements Serializable {

@ManagedProperty(value = "#{envioSujetoService}")
private IEnvioService envioService;
private Envio envio;
private List<Envio> listaAllEnvios;
private LazyEnvioSujetoDataModel lazyListaAllEnvios;
private Envio envioSeleccionado;

/**
 * 
 * Getters y Setters
 */
@PostConstruct
public void init(){
    if (lazyListaAllEnvios == null) {
        lazyListaAllEnvios = new LazyEnvioSujetoDataModel(envioService);
    }
}

public void setEnvioService(final IEnvioService envioService) {
    this.envioService = envioService;
}

public Envio getEnvio() {
    return envio;
}

public void setEnvio(final Envio envio) {
    this.envio = envio;
}

public List<Envio> getListaAllEnvios() {
    if (listaAllEnvios == null) {
        listaAllEnvios =  envioService.getAll();
    }
    return listaAllEnvios;
}

public void setListaAllEnvios(final List<Envio> listaAllEnvios) {
    this.listaAllEnvios = listaAllEnvios;
}

public Envio getEnvioSeleccionado() {
    return envioSeleccionado;
}

public void setEnvioSeleccionado(final Envio envioSeleccionado) {
    this.envioSeleccionado = envioSeleccionado;
}

/**
 * Métodos de navegación
 */
public String goToEditarEnvio() {
    FacesUtils.saveObjectInFlashScope("envio", envioSeleccionado);
    return "/pages/gestionsujetos/envio.xhtml?faces-redirect=true";
}

public LazyEnvioSujetoDataModel getLazyListaAllEnvios() {
    return lazyListaAllEnvios;
}

public void setLazyListaAllEnvios(final LazyEnvioSujetoDataModel lazyListaAllEnvios) {
    this.lazyListaAllEnvios = lazyListaAllEnvios;
}
}

此外,我们试图对数据进行延迟加载,但它不起作用。这是我们使用的数据模型(来自PrimeFaces.org上的Lazy Loding示例的改编类):

package es.cne.sicbios.managedbean.gestionsujetos;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ViewScoped;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SelectableDataModel;
import org.primefaces.model.SortOrder;

import es.cne.sicbios.entities.tramites.envios.Envio;
import es.cne.sicbios.services.tramites.envios.IEnvioService;

/**
 * Dummy implementation of LazyDataModel that uses a list to mimic a real datasource like a database.
 */
@ViewScoped
public class LazyEnvioSujetoDataModel extends LazyDataModel<Envio> implements Serializable, SelectableDataModel<Envio> {

/**
 * 
 */
private static final long serialVersionUID = 983251078912322527L;
private final List<Envio> datasource;


public List<Envio> getDatasource() {
    return datasource;
}

public LazyEnvioSujetoDataModel(final IEnvioService envioService) {
    this.datasource = envioService.getAll();
}

@Override
public Envio getRowData(final String rowKey) {
    for(final Envio envio : datasource) {
        if(envio.getId().equals(rowKey))
            return envio;
    }

    return null;
}

@Override
public Object getRowKey(final Envio envio) {
    return envio.getId();
}

@Override
public List<Envio> load(final int first, final int pageSize,
        final String sortField, final SortOrder sortOrder, final Map<String,String> filters) {
    final List<Envio> data = new ArrayList<Envio>();

    //filter
    for(final Envio envio : datasource) {
        boolean match = true;

        for(final Iterator<String> it = filters.keySet().iterator(); it.hasNext();) {
            try {
                final String filterProperty = it.next();
                final String filterValue = filters.get(filterProperty);
                final String fieldValue = String.valueOf(envio.getClass().getField(filterProperty).get(envio));

                if(filterValue == null || fieldValue.startsWith(filterValue)) {
                    match = true;
                }
                else {
                    match = false;
                    break;
                }
            } catch(final Exception e) {
                match = false;
            }
        }

        if(match) {
            data.add(envio);
        }
    }

    //sort
    //      if(sortField != null) {
    //          Collections.sort(data, new LazySorter(sortField, sortOrder));
    //      }

    //rowCount
    final int dataSize = data.size();
    this.setRowCount(dataSize);

    //paginate
    if(dataSize > pageSize) {
        try {
            return data.subList(first, first + pageSize);
        }
        catch(final IndexOutOfBoundsException e) {
            return data.subList(first, first + (dataSize % pageSize));
        }
    }
    else {
        return data;
    }
}
}

这个问题有什么想法吗?提前谢谢你,胡安乔。

共有2个答案

相洛华
2023-03-14

我也有同样的问题,当我意识到这是因为我不小心使用了

import javax.faces.bean.ViewScoped;

包装代替

import javax.faces.view.ViewScoped;
华章横
2023-03-14

团队的一位朋友得到了这个问题的答案。我们正在使用Spring工具套件,有时它会更改JSF托管bean的保存方法。我们需要在我们的网络上有这个。xml:

<context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>server</param-value>
</context-param>
 类似资料:
  • 我正在使用DSS签署Pdf文档。我需要这些文档有时间戳并启用LTV(启用PAdES LTV)。 我遇到了一些关于撤销数据的问题。 我对这个领域有点陌生,所以请容忍我。 我按照DSS本身提供的说明和演示进行操作,但没有效果。 我已经成功地使用PAdES B和PAdES T签署了Pdf,所以我的TSA服务设置正确。 我遇到的问题是,每次我尝试使用LTV签署Pdf时,都会出现以下错误:“eu.europ

  • 我正在使用primeface 3.5,我希望在以下问题上得到帮助: 我有一个选择模式为single的datatable,所选项目是绑定到对象,而不是特定对象属性上的对象。下面的示例代码: 在项目创建期间,我不会立即将项目持久化到数据库,而是维护一个项目列表,并在操作保存处理程序期间持久化整个列表。 问题是,对于每个新创建的项,我都没有生成对象id(在持久化时在数据库上自动完成),并且在表上选择行的

  • 我正在使用java,从服务器收到了一些json字符串。我收到了带有readUTF的json字符串,但是有一些数据丢失了。我没有收到每个json包的前两个字符。另一个问题是收到json字符串有延迟。例如,服务器发送了一个json字符串,客户端无法收到它,直到服务器和客户端发送的大约50个json字符串突然显示所有的json字符串。主要问题是什么? 因为服务器用UTF格式发送数据,所以我不能用Buff

  • 我有两个类:停车场和汽车。公园有一个ID和一个汽车列表。我想在数据表中显示带有标签的停车场和汽车列表。问题是我无法在数据表中找到汽车的车牌号。当我尝试在Netbean中自动完成时,它会显示可能的公园字段(公园ID和汽车列表)。为什么?有什么想法如何修复它吗?

  • 该页显示列表中的正确值。然而,当我尝试选择一个项目。它不起作用。 我能在列表中选择一个项目吗?

  • 我正在尝试在datatable(primefaces 3.5)中进行筛选。仅当用户单击commandLink时才应触发筛选器。 我的桌子: 我有3个问题与此代码: 1-过滤器不工作。如果我点击命令链接,页面会重新加载,但没有任何内容被过滤。可能是因为#form\: filteredTable\:statusColumn_filter'). val()返回未定义。所以我想我没有设置过滤器的值(对吗?