Row was updated or deleted by another transaction [RESOLVIDO]

2 respostas
fernandogodoy18

Esta acontecendo o seguinte na minha aplicação

Efetuo a consulta e mando editar, após o save ele retorna para minha tela do List,
realizo nova consulta e mando editar novamente o mesmo dado, quando mando salvar ele me retorna este erroo…

Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect)

Alguem jaa teve uma situação parecida com está??!

2 Respostas

drsmachado

Qual o banco?
Como está teu código?

fernandogodoy18

então!
me bati tanto que acabei revertendo tudo que tinha feito e partido pra outra opção!

mais o que acontence é o seguinte…
Minha aplicação está toda com SessionScoped e pretendo mudar tudo para ViewScoped

Meu banco é o PostGree
meu código tava mais o menos assim…

O list

<p:panel header="CADASTRO DE SÉRIE" >
                <h:form id="form">                    
                                <h:inputText value="#{serieMB.descricao}" />
                                <p:commandButton value="Consultar" async="true" update="table" action="#{serieMB.consultar}" styleClass="botoes"/>
                                <p:ajaxStatus onstart="statusDialog.show();" onsuccess="statusDialog.hide();"/>
                                <p:dialog modal="true" header="Efetuando Consulta" widgetVar="statusDialog" draggable="false" closable="false" width="450">
                                    <h:graphicImage value="../Imagens/ajaxloading.gif" />
                                </p:dialog>                         


                    <p:commandButton  value="Novo" action="#{serieMB.novo}" ajax="false" style="float: right; margin-top: -45px;"/>

                    <p:dataTable id="table" value="#{serieMB.series}" var="c" paginator="true" rows="20" emptyMessage="Nenhum registro encontrado." >
                        <p:column>
                            <f:facet name="header" >
                                <h:outputText value="SÉRIE"/>
                            </f:facet>
                            <h:outputText value="#{c.cSerie}" />
                        </p:column>
                        <p:column >
                            <f:facet name="header" >
                                <h:outputText value="DESCRIÇÃO" />
                            </f:facet>
                            <h:outputText value="#{c.xSerie}" />
                        </p:column>
                        <p:column styleClass="acaoColuna">
                            <f:facet name="header" >
                                <h:outputText value="AÇÃO" />
                            </f:facet>
                            <p:commandButton action="SerieForm?faces-redirect=true&amp;includeViewParams=true" value="EDITAR" ajax="false" styleClass="botoes">
                                <f:setPropertyActionListener value="#{c}" target="#{serieMB.serie}" />
                            </p:commandButton>
                            <p:commandButton  value="EXCLUIR" onclick="confirmation.show()" styleClass="botoes">
                                <f:setPropertyActionListener value="#{c}" target="#{serieMB.serie}" />
                            </p:commandButton>
                            <p:confirmDialog message="Deseja realmente excluir este registro?" hideEffect="explode" header="Aviso" severity="alert" widgetVar="confirmation">
                                <p:commandButton value="Sim" oncomplete="confirmation.hide()" action="#{serieMB.excluir}" update="table" ajax="false" />
                                <p:commandButton value="Não" onclick="confirmation.hide()" type="button" />
                            </p:confirmDialog>
                        </p:column>
                    </p:dataTable>
                </h:form>

O Form

<h:form id="form">
                <p:message for="serie" />
                <p:panel header="CADASTRO DE SÉRIE">
                    <h:panelGrid id="serie" columns="3" cellpadding="5" cellspacing="3" dir="LTR" >

                        <h:outputLabel value="ULTIMA ATUALIZAÇÃO:"/>
                        <h:outputLabel value="#{serieMB.serie.versao}" id="versao" converter="dataAtualizacaoConverter"/>
                        <h:outputText/>

                        <h:outputLabel value="SÉRIE:"/>
                        <h:inputText value="#{serieMB.serie.cSerie}" id="cSerie" maxlength="3" size="5">
                                  <f:validateLength  minimum="1" maximum="3"/>
                        </h:inputText>
                        <p:message for="cSerie" />

                        <h:outputLabel value="DESCRIÇÃO:"/>
                        <h:inputText value="#{serieMB.serie.xSerie}" id="xSerie" maxlength="60" size="60">                                     
                            <f:validateLength  minimum="1" maximum="60" />
                        </h:inputText>
                        <p:message for="xSerie" />

                        <h:outputText />
                        <h:panelGroup>
                            <p:commandButton value="Salvar" style=" margin-right: 10px;" action="#{serieMB.salvar}" ajax="false" />
                            <p:commandButton value="Limpar" style=" margin-right: 10px;" type="reset" />
                            <p:button outcome="serieList" value="Cancelar" style="margin-left: 10px;"/>
                        </h:panelGroup>
                    </h:panelGrid>
                </p:panel>
            </h:form>

Tem o Converter

@FacesConverter(forClass= Serie.class)
public class SerieConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String string) {
		System.out.println("SerieConverter.getAsObject(): " + string);
		if(string == null || string.isEmpty()){
			return null;
		}
		SerieDao sdao = new SerieDaoImpl();
                return sdao.getById(Long.valueOf(string));		
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object object) {
		Serie serie = (Serie) object;
		System.out.println("SerieConverter.getAsString(): " + serie);
		if(serie == null || serie.getIdSerie() == null){
			return null;
		}
		return String.valueOf(serie.getIdSerie());
	}
}

A entidade

@Entity
@Table(name = "SERIE")
public class Serie implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "IDSERIE")
    private Long idSerie;
    @Column(name = "CSERIE", length= 3)
    private String cSerie;
    @Column(name = "XSERIE", length= 60)
    private String xSerie;
    @Version
    @Column(name = "VERSAO")   
    private Timestamp versao;
}

//getters e setters omitidos

e o ManageBean

@ManagedBean
@ViewScoped
public class SerieMB implements Serializable {

    private Serie serie;
    private List<Serie> series;
    private String numero;
    private String descricao;
    
// getters e setters omitidos

    /** Creates a new instance of SerieMB */
    public SerieMB() {
    }

    @PostConstruct
     public void init(){		
	atribuirEstadoInicial();
     }


    public void atribuirEstadoInicial(){
    serie = Serie();
    series = null
    }

    
    public String novo() {
        atribuirEstadoInicial()
        numero = null;
        descricao = null;
        return "/cadastros/serieForm.nfe";
    }

    public void salvar() {
        SerieDao dao = new SerieDaoImpl();
        try {
            dao.save(serie);
            atribuirEstadoInicial()
            numero = null;
            descricao = null;
            FacesContext.getCurrentInstance().getExternalContext().redirect("serieList.nfe");
        } catch (StaleObjectStateException sose) {
            JSFUtil.getInstance().mensagemErro("form:serie", "Erro ao tentar salvar o registro." + sose.getMessage());
        } catch (IOException io) {
            JSFUtil.getInstance().mensagemErro(null, String.valueOf(io.getCause()));
        }
    }

    
    public void consultar() {
       atribuirEstadoInicial()
        SerieDao dao = new SerieDaoImpl();
        series = dao.consulta(numero, descricao);
    }

    public void excluir() {
        SerieDao dao = new SerieDaoImpl();
        dao.delete(serie);
        atribuirEstadoInicial()
    }
}

O código tava bem parecido com isso,
da uma olhada ai,
Eu não entendo muito de cachê mais pela forma como os dados estavam sendo apresentados creio eu que tenha algo a ver com isso…

Criado 31 de janeiro de 2011
Ultima resposta 1 de fev. de 2011
Respostas 2
Participantes 2