Jsf, primefaces, Datable e dialog - problema na validação

To fazendo uma tela com um dataTable do primefaces, onde listo os dados de uma tabela, e a partir dela edito o registro em um dialog. Tudo funcionando ok.

O meu problema é quando faço uma validação e retorno um erro. Tipo tendo um campo do banco com unique ex campo descrição, verifico se já existe, se sim retorno a mensagem de erro e não salva, como deve ser. Só que ai ele dá o update no datatable, como deveria caso estivesse sem erro de validação. Fiz uma alteração pra ele só dar o update se estiver ok via context.update(“frm:tblAss”) deu certo não atualizou o dataTable quando com erro. Mas quando eu clico no mesma linha da dataTable ele me mostra no dialog o valor do registro que tinha no erro e não o valor que tá aparecendo no DataTable.

Se alguem tiver uma ideia de como melhor isso.

XHTML

<h:form id="frm">
        <p:messages autoUpdate="true" closable="true" />

        <p:dataTable id="tblAss" var="ass" value="#{tipoAssinaturasBean.listaTipoAssinaturas}"
                     emptyMessage="Nenhum registro encontrado." style="width:800px"
                     paginator="true" paginatorAlwaysVisible="false" paginatorPosition="bottom" rows="15">

            <p:column headerText="Código" width="10%">
                <h:outputText value="#{ass.id}"/>
            </p:column>
            <p:column headerText="Descrição">
                <h:outputText value="#{ass.descricao}"/>
            </p:column>

            <p:column width="10%" style="text-align: center">
                <p:commandButton icon="ui-icon-pencil" title="Editar" oncomplete="PF('dlgAlt').show();"
                                 process="@this" update="frm:dlg">
                    <f:setPropertyActionListener target="#{tipoAssinaturasBean.tipoAssinatura}" value="#{ass}"/>
                    <p:resetInput target="frm:grid"/>
                </p:commandButton>
                <p:commandButton icon="ui-icon-trash" title="Excluir" oncomplete="PF('cfmExclusao').show();"
                                 process="@this" update=":frm:cfm">
                    <f:setPropertyActionListener target="#{tipoAssinaturasBean.tipoAssinatura}" value="#{ass}"/>
                </p:commandButton>
            </p:column>


        </p:dataTable>

        <p:commandButton value="Novo" icon="ui-icon-document" style="margin-top: 5px" oncomplete="PF('dlgAlt').show();" 
                         process="@this" update="frm:dlg" action="#{tipoAssinaturasBean.novo}" >
            <p:resetInput target="frm:grid"/>
        </p:commandButton>


        <p:confirmDialog header="Exclusão Tipo Assinatura" widgetVar="cfmExclusao" id="cfm"
                         message="Tem certeza que deseja excluir tipo de Assinatura #{tipoAssinaturasBean.tipoAssinatura.id}?">
            <p:button value="Não" onclick="PF('cfmExclusao').hide();return false;" />
            <p:commandButton value="Sim" oncomplete="PF('cfmExclusao').hide();" process="@this"
                             action="#{tipoAssinaturasBean.excluir()}" update=":frm:tblAss"/>
        </p:confirmDialog>

        <p:dialog header="Alterações" widgetVar="dlgAlt" id="dlg" modal="true" >             
            <p:messages id="msg" />
            <p:panelGrid id="grid" columns="2">
                <p:outputLabel value="Código" for="cod" />
                <p:inputText id="cod" value="#{tipoAssinaturasBean.tipoAssinatura.id}" disabled="true" />

                <p:outputLabel value="Descrição" for="desc"/>
                <p:inputText id="desc" value="#{tipoAssinaturasBean.tipoAssinatura.descricao}" />
            </p:panelGrid>
            <p:commandButton value="Salvar" action="#{tipoAssinaturasBean.salvar()}" 
                             oncomplete="if(!args.validationFailed &amp;&amp; args.salvo){ PF('dlgAlt').hide() }"
                             process="@this frm:dlg" update="msg grid"/>

        </p:dialog>

    </h:form>

Método Salvar

public void salvar() {

    RequestContext context = RequestContext.getCurrentInstance();
    context.addCallbackParam("salvo", false);

    tipoAssinaturasRn.salvar(tipoAssinatura);

    if(!listaTipoAssinaturas.contains(tipoAssinatura)){
        listaTipoAssinaturas.add(tipoAssinatura);
    }
    context.addCallbackParam("salvo", true);
    context.update("frm:tblAss");
    FacesUtil.addInfoMessage("Tipo Assinatura salvo com Sucesso.");
}