[resolvido] selectOneMenu não altera dados

Eu tenho um selectOneMenu dentro de uma tabela com rowEditing no primefaces, e o rowEditing está alterando normalmente os outros dados como nome etc. Mas quando chega na hora de escolher uma cidade com o selectOneMenu, ele simplesmente ignora minha alteração, e continua com a anterior…

Eu vi em certos casos que necessita de um converter, mas quando não uso o rowEditing para alterar, funciona normalmente, então acho que não deve ser necessário um converter

 <p:column headerText="Cidade" style="width:20%">  
            <p:cellEditor>  
                <f:facet name="output">  
                    <h:outputText value="#{item.cidade.nomeCidade}" />  
                </f:facet>  
                <f:facet name="input">  
                    <h:selectOneMenu id="cidade" value="#{clienteControle.idCidade}">
                        <f:selectItems value="#{cidadeControle.lista}"  
                            var="itens"   
                            itemLabel="#{itens.nomeCidade}"  
                            itemValue="#{itens.idCid}" />
                    </h:selectOneMenu>  
                </f:facet>  
            </p:cellEditor>  
        </p:column> 

e este é o metodo que eu chamo quando clico para alterar:

public void onEdit(RowEditEvent event) {  
        Object itemAlterado = event.getObject();
        
        em.getTransaction().begin();
            em.merge(itemAlterado);
        em.getTransaction().commit();    
            
        FacesMessage msg = new FacesMessage("Cliente editado");
  
        FacesContext.getCurrentInstance().addMessage(null, msg); 
        
    }  

Alguma ideia do que está errado? É realmente necessário um converter?

Se este trecho:

for assim:

<h:selectOneMenu id="cidade" value="#{clienteControle.cidade}"> precisa de converter

e se for assim:

não precisa de converter

Do jeito que eu coloquei ele grava os outros dados, mas ignora o selectOneMenu, do jeito que voce colocou em que não precisa de converter, ele não grava nada pois não da para clicar no botão de salvar…

Hoje eu pude olhar melhor o seu post.

Tem uma coisa errada aí. Como vc está dentro de uma datatable com cell-editing, este trecho

<f:facet name="output"> <h:outputText value="#{item.cidade.nomeCidade}" /> </f:facet> <f:facet name="input"> <h:selectOneMenu id="cidade" value="#{clienteControle.idCidade}"> <f:selectItems value="#{cidadeControle.lista}" var="itens" itemLabel="#{itens.nomeCidade}" itemValue="#{itens.idCid}" /> </h:selectOneMenu> </f:facet>
precisa ser assim,

<f:facet name="output"> <h:outputText value="#{item.cidade.nomeCidade}" /> </f:facet> <f:facet name="input"> <h:selectOneMenu id="cidade" value="#{item.cidade}"> <f:selectItems value="#{cidadeControle.lista}" var="itens" itemLabel="#{itens.nomeCidade}" itemValue="#{itens}" /> </h:selectOneMenu> </f:facet>

Eu tentei do jeito que você falou e dá erro de converter

Então eu coloco o converter e dá este erro:

Este foi o converter que eu coloquei:

public class CidadeConverter implements Serializable, Converter{
@Override
public Cidade getAsObject(FacesContext fc, UIComponent uic, String string) {
   if (string == null){
   return null;
   }
       return GeraEntityManager.getInstance().getEntityManager().find(Cidade.class,
       Integer.parseInt(string));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o) {
    if (o == null){
    return null;
    }
       Cidade obj = (Cidade) o;
       return obj.getIdCid().toString();
    }
}

Debuga esse teu converter, ve se está chegando um ID na string;

e se está chegando uma cidade no Object o;

Outra coisa

Cidade e companhia estão implementando equals e hashcode pelo ID?

Era exatamente o equals e o hashcode, implementei eles e funcionou!

obrigado pelo toque… vlw!