更新数据库后如何更新DataTable数据?

时间:2015-04-12 01:14:51

标签: ajax jsf primefaces datatable

我有以下问题:

我有一个关于该数据表的PrimeFaces组件<p:datatable /><p:contextMenu />的视图。此contextMenu具有actionListener属性,用于在Managed Bean中启动方法。此方法仅更新当前状态文档,我在触发器下面执行此操作。

当我点击表格的contextMenu时,数据库中的字段(currenstate)会正确更新,但<p:datatable />中当前文档的新值未更新

我如何解决这个问题?

这是我的DAO课程:

@Stateless
public class TramitesDaoImp implements TramitesDao {
    @PersistenceContext( unitName = "tramites")
    EntityManager em;

// ... more methods 


@SuppressWarnings("unchecked")
    @Override
    public List<Tramite> findAllTramiteBy_EstadoTramite(boolean estadoTramite) {


        String consultaSql = "select t from Tramite t where t.estadoTramite = :paramEstado";

        Query query = em.createQuery( consultaSql );
        query.setParameter( "paramEstado", estadoTramite  ); 

        return query.getResultList();
    }



    @Override
public int passToNextLevel(int idTramite) {

    StoredProcedureQuery storedProcedure = em.createStoredProcedureQuery( "pasarTramiteNextLevel" );
    storedProcedure.registerStoredProcedureParameter( "idTramiteActual", Integer.class, ParameterMode.IN );
    storedProcedure.setParameter( "idTramiteActual", idTramite );

    storedProcedure.execute();

    return 1;
}

这是我的托管bean:

@ManagedBean
@ViewScoped
public class TramitesBean implements Serializable{

@Inject
private TramitesService tramiteService;

//////// LISTS //////////////
private List< Tramite > listaTramiteObservados;
private List< Carrera > listaCarreras;

    @PostConstruct
    public void inicializar()
    {

// The method listarTodoTramiteBy_EstadoTramite( boolean ), calls this method : findAllTramiteBy_EstadoTramite( boolean ) to get a List
    this.listaTramiteObservados = tramiteService.listarTodoTramiteBy_EstadoTramite( true );
    this.listaCarreras = tramiteService.listarTodasCarreras();

}


//..... more methods
//.... getters and setters


    public void passToNextLevel()
    {
        int filasAfectadas = 0;

        // Pasamos el tramite seleccionado al siguiente nivel
        filasAfectadas = tramiteService.pasarSiguienteNivel( tramiteSeleccionado.getIdTramite() );

        if( filasAfectadas != 0 )
        {
            mostrarMensaje( "INFORMACION", "EL TRAMITE PASÓ AL SIGUIENTE NIVEL DE FORMA CORRECTA");
        }
        else
        {
            mostrarMensaje( "ATENCION", "HUBO UN ERROR AL PASAR EL TRAMITE AL SIGUIENTE NIVEL", FacesMessage.SEVERITY_ERROR );
        }
    }
}

这是我的观点:

<h:form>
    <p:growl id="mensajes" showDetail="true" />

    <p:dataTable id="tablaTramitesObs"
        value="#{tramitesBean.listaTramiteObservados}" var="obs"
        widgetVar="tablaObs" paginator="true" rows="10" stickyHeader="false"
        resizableColumns="true" scrollable="true" selectionMode="single"
        selection="#{tramitesBean.tramiteSeleccionado}"
        rowKey="#{obs.idTramite}"
        emptyMessage="NO SE ENCONTRARON RESULTADOS ">

            <f:facet name="filter" >
                <p:selectOneMenu onchange="PF( 'tablaObs' ).filter()" style="width:190px">
                    <f:selectItem itemValue="#{null}" itemLabel="* TODOS *"
                        noSelectionOption="true" />
                    <f:selectItems value="#{tramitesBean.listaLugarActualTramite}"
                        var="lugarActual" itemLabel="#{lugarActual.descLugarActual}" />
                </p:selectOneMenu>
            </f:facet>
        <p:column>
            <h:outputText value="#{obs.lugaractualtramite.descLugarActual}" />
        </p:column>

    </p:dataTable>

    <p:contextMenu for="tablaTramitesObs">
        <p:menuitem value="Pasar al Siguiente Nivel.." actionListener="#{tramitesBean.pasarAlSiguienteNivel() }" process="@form" update="@form" 
        immediate="false" />
    </p:contextMenu>
</h:form>

1 个答案:

答案 0 :(得分:0)

虽然update="@form"将会更新&#34;在客户端的表中,您可能仍需要更新服务器端的tramitesBean.listaTramiteObservados集合。

我不确定,因为你没有包含TramitesBean的全部内容(谢谢你保持简单),但我想你的listaTramiteObservados已经过时了。在返回之前,您是否可以使用passToNextLevel方法从数据库中刷新listaTramiteObservados?然后,当客户端update运行时,它将读取新信息。