[RESOLVIDO] Tela de Edição não seta valor no selectOneMenu

Olá pessoal, estou criando esse tópico apesar de ter outros com assunto semelhante, porém nenhum deles me trouxe a solução para o meu problema então por isso vou perguntar aqui novamente.

Vamos ao problema:

O sistema de exemplo eu faço um cadastro de bancos, depois de agências que é vinculada a um banco.

Tenho uma tela que possui um DataTable listando todos as agências cadastradas, e nessa tabela disponibilizo um botão para desativar a agência, apenas faz um update e set de ativo pra inativo, até ai tudo bem porém no botão para edição quando eu clico nele o usuário é redirecionado para a tela de de cadastro de agência, que serve tanto para edição quanto para inserção, e nessa tela todos os inputs vem carregados com os dados da agência que eu cliquei perfeitamente, o problema está no selecOneMenu que é utilizado para listar os bancos cadastrados onde eu escolho um para vincular à minha agência, no model agência tem um atributo banco, ou seja, nesse selectOneMenu de listagem de bancos eu gostaria que o mesmo já viesse selecionado o banco ao qual essa agência já está vinculada, sendo que esse selectOneMenu não seleciona de jeito nenhum, os outros campos vem preenchidos porém esse não vem. Vou listar abaixo os códigos do meu model, da minha tela de listagem e tela de cadastro e os beans de listagem e cadastro, se alguém puder me ajudar.

Meu Model Agencia.java

'package br.com.r2soft.r2boletos.model;

import java.io.Serializable;
import java.time.LocalDateTime;

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import br.com.r2soft.r2boletos.util.jpa.converters.LocalDateTimeConverter;

@Entity
@Table(name = "agencias")
public class Agencia implements Serializable {

	private static final long serialVersionUID = 1L;

	private Long id;
	private String descricao;
	private String numero;
	private String digitoVerificador;
	private String telefoneContato;
	private String pessoaContato;
	private Banco banco;
	private Boolean ativo;
	private LocalDateTime criado;
	private LocalDateTime modificado;
	
	@Id
	@SequenceGenerator(name = "pk_agencia_sequence", sequenceName = "agencia_id_sequence", allocationSize = 1, initialValue = 1)
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk_agencia_sequence")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	
	@Column(name = "descricao", length = 255, nullable = true)
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	
	@Column(name = "numero", length = 10, nullable = false)
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	
	@Column(name = "digito_verificador", length = 2, nullable = true)
	public String getDigitoVerificador() {
		return digitoVerificador;
	}
	public void setDigitoVerificador(String digitoVerificador) {
		this.digitoVerificador = digitoVerificador;
	}
	
	@Column(name = "telefone_contato", length = 15)
	public String getTelefoneContato() {
		return telefoneContato;
	}
	public void setTelefoneContato(String telefoneContato) {
		this.telefoneContato = telefoneContato;
	}
	
	@Column(name = "pessoa_contato", length = 40)
	public String getPessoaContato() {
		return pessoaContato;
	}
	public void setPessoaContato(String pessoaContato) {
		this.pessoaContato = pessoaContato;
	}
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "banco_id")
	public Banco getBanco() {
		return banco;
	}
	public void setBanco(Banco banco) {
		this.banco = banco;
	}
	
	@Column(name = "ativo")
	public Boolean getAtivo() {
		return ativo;
	}
	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}
	
	@Convert(converter = LocalDateTimeConverter.class)
	@Column(name = "criado", nullable = false)
	public LocalDateTime getCriado() {
		return criado;
	}
	public void setCriado(LocalDateTime criado) {
		this.criado = criado;
	}
	
	@Convert(converter = LocalDateTimeConverter.class)
	@Column(name = "modificado", nullable = false)
	public LocalDateTime getModificado() {
		return modificado;
	}
	public void setModificado(LocalDateTime modifiado) {
		this.modificado = modifiado;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Agencia other = (Agencia) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return "Agencia [id=" + id + ", descricao=" + descricao + ", numero=" + numero + ", digitoVerificador="
				+ digitoVerificador + "]";
	}
	
}'

Meu Bean de adição e edição

'package br.com.r2soft.r2boletos.controller.agencia;

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

import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.r2soft.r2boletos.model.Agencia;
import br.com.r2soft.r2boletos.model.Banco;
import br.com.r2soft.r2boletos.service.AgenciaService;
import br.com.r2soft.r2boletos.service.BancoService;
import br.com.r2soft.r2boletos.util.jsf.FacesUtil;

@Named
@ViewScoped
public class AdicionarAgenciaBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@Inject
	private BancoService bancoService;
	@Inject
	private AgenciaService agenciaService;

	private Agencia agencia;
	private List<Banco> bancos;

	public AdicionarAgenciaBean() {
		this.limpar();
	}

	/************************************************************
	 * GETTERS AND SETTERS
	 **********************************************************/
	public Agencia getAgencia() {
		return agencia;
	}

	public void setAgencia(Agencia agencia) {
		this.agencia = agencia;
	}

	public List<Banco> getBancos() {
		return bancos;
	}

	/************************************************************
	 * MÉTODOS DE NEGÓCIO
	 **********************************************************/
	public String salvar() {

		Agencia agencia = this.salvarPrivado();

		if (agencia != null) {
			FacesUtil.adicionarMensagemInfo("Salvo com sucesso! ");

			return "listar-agencias";
		}

		FacesUtil.adicionarMensagemErro(
				"Houve um problema durante o armazenamento das informações, por favor, tente novamente.");
		return "";
	}

	public void salvarENovo() {
		this.agencia = this.salvarPrivado();

		if (agencia != null) {
			FacesUtil.adicionarMensagemInfo("Salvo com sucesso!");
			this.limpar();
		} else {
			FacesUtil.adicionarMensagemErro(
					"Houve um problema durante o armazenamento das informações, por favor, tente novamente.");
		}
		
		this.limpar();

	}

	/************************************************************
	 * MÉTODOS UTILITÁRIOS
	 **********************************************************/
	public void limpar() {
		this.agencia = new Agencia();
	}

	public void inicializar() {
		this.bancos = this.bancoService.listarTodos();
	
	}
	
	private Agencia salvarPrivado() {
		return this.agenciaService.salvar(this.agencia);
	}
	
	public String abandonarTela() {
		return "listar-agencias";
	}
}'

Agora minha tela de listagem listar-agencias.xhtml

'<ui:composition xmlns="http://www.w3.org/1999/xhtml"
			    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
			    xmlns:h="http://xmlns.jcp.org/jsf/html"
			    xmlns:f="http://xmlns.jcp.org/jsf/core"
			    xmlns:p="http://primefaces.org/ui"
			    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
			    xmlns:jsf="http://xmlns.jcp.org/jsf"
                template="/WEB-INF/template/template.xhtml">
                
    <ui:define name="title">#{msg.agencia_titulo_listar}</ui:define>
    
    <ui:define name="content">
    
    	<f:metadata>
    		<f:viewAction action="#{listarAgenciaBean.inicializar}" />
    	</f:metadata>
    	
    	<div class="Container100 Responsive100">
    		
    		<div class="ContainerIndent">
    			
    			<div class="ShadowBox whiteback BlueBorderedBox">
    			
    				<h2 class="BigTopic">#{msg.agencia_subtitulo_listar}</h2>
					<div class="EmptyBox20"></div>
					
					<p:messages autoUpdate="true" id="msg" closable="true" />
					
					<h:form id="frm">
					
						<p:toolbar styleClass="no-toolbar-border">
							<p:toolbarGroup>
								<p:button outcome="dashboard" id="btn-voltar" icon="fa fa-arrow-left Fs16 white" />
								<p:button id="btn-novo" icon="fa fa-plus Fs16 white" value="#{msg.btn_novo}" styleClass="button-menu-acoes" outcome="adicionar-agencia" />
							</p:toolbarGroup>
						</p:toolbar>

						<div class="EmptyBox20"></div>
						
						<p:dataTable reflow="true" id="tbl-agencias" emptyMessage="#{msg.agencia_tabela_vazia}" rows="20"
								paginator="true" paginatorAlwaysVisible="false" paginatorPosition="bottom" value="#{listarAgenciaBean.agencias}" var="agencia">
								<p:column styleClass="TexAlCenter" headerText="Número + DV">
									<h:outputText id="numero-digitorverificador" value="#{agencia.digitoVerificador}" />
								</p:column>
								
								<p:column headerText="Referência">
									<h:outputText id="referencia" value="#{agencia.descricao}" />
								</p:column>
								
								<p:column headerText="Contato">
									<h:outputText id="contato" value="#{agencia.pessoaContato}" />
								</p:column>
								
								<p:column headerText="Telefone">
									<h:outputText id="telefone" value="#{agencia.telefoneContato}" />
								</p:column>
								
								<p:column styleClass="TexAlCenter" headerText="Ações">
									<p:button outcome="visualizar-agencia" id="btn-visualizar" value="#{msg.btn_tbl_visualizar}">
										<f:param name="agencia" value="#{agencia.id}" />
									</p:button>
									<p:button outcome="adicionar-agencia" id="btn-editar" icon="fa fa-pencil Fs16 white">
										<f:param name="agencia" value="#{agencia.id}" />
									</p:button>
									<p:commandButton id="btn-desativar" value="#{msg.btn_tbl_desativar}">
										<p:confirm header="#{msg.agencia_modal_desativar_header}" message="#{msg.agencia_modal_desativar_message}" icon="ui-icon-alert" />
										<f:setPropertyActionListener value="#{agencia}" target="#{listarAgenciaBean.agenciaDesativada}" />
									</p:commandButton>
								</p:column>
							</p:dataTable>
							
							
							<p:confirmDialog id="confirm-dialog-sair-tela" global="true" showEffect="fade" hideEffect="fade">
								<p:commandButton value="#{msg.btn_modal_sim}" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
								<p:commandButton value="#{msg.btn_modal_nao}" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
							</p:confirmDialog>
					
					</h:form>
    			
    			</div>
    			
    		</div>
    		
    	</div>
    
    </ui:define>

</ui:composition>'

e minha tela de Adição e Edição adicionar.xhtml

'<ui:composition xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
	xmlns:h="http://xmlns.jcp.org/jsf/html"
	xmlns:f="http://xmlns.jcp.org/jsf/core"
	xmlns:p="http://primefaces.org/ui"
	xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
	xmlns:jsf="http://xmlns.jcp.org/jsf" xmlns:o="http://omnifaces.org/ui"
	template="/WEB-INF/template/template.xhtml">

	<ui:define name="title">#{msg.agencia_titulo_adicionar}</ui:define>

	<ui:define name="content">
		<f:metadata>
			<o:viewParam name="agencia" value="#{adicionarAgenciaBean.agencia}" />
			<f:viewAction action="#{adicionarAgenciaBean.inicializar}" />
		</f:metadata>
		<div class="ShadowBox whiteback BlueBorderedBox">
			<h:form id="frm">
				<div class="Container100 Responsive100">
					<div class="ContainerIndent">

						<h2 class="BigTopic">Adicionar Agência</h2>
						<div class="EmptyBox20"></div>

						<p:messages autoUpdate="true" id="msg" closable="true" />

						<p:toolbar styleClass="no-toolbar-border">
							<p:toolbarGroup>
								<p:commandButton id="btn-voltar" process="@this"
									action="#{adicionarAgenciaBean.abandonarTela}"
									icon="fa fa-arrow-left Fs16 white">
									<p:confirm header="#{msg.agencia_modal_sair_tela_header}"
										message="#{msg.agencia_modal_sair_tela_message}"
										icon="ui-icon-alert" />
								</p:commandButton>
								<p:commandButton id="btn-salvar"
									icon="fa fa-floppy-o Fs16 white" value="#{msg.btn_salvar}"
									action="#{adicionarAgenciaBean.salvar}"
									styleClass="button-menu-acoes" />
								<p:commandButton id="btn-salvar-novo"
									value="#{msg.btn_salvarnovo}"
									actionListener="#{adicionarAgenciaBean.salvarENovo}"
									styleClass="button-menu-acoes" process="@form" update="@form" />
							</p:toolbarGroup>
							<p:toolbarGroup align="right">
								<p:commandButton id="btn-limpar" styleClass="RedButton"
									value="#{msg.btn_limpar}"
									actionListener="#{adicionarAgenciaBean.limpar}" update="@form"
									process="@this" />
								<p:commandButton id="btn-descartar"
									styleClass="RedButton button-menu-acoes"
									value="#{msg.btn_descartar}" process="@this"
									action="#{adicionarAgenciaBean.abandonarTela}">
									<p:confirm header="#{msg.agencia_modal_limpar_tela_header}"
										message="#{msg.agencia_modal_sair_tela_message}"
										icon="ui-icon-alert" />
								</p:commandButton>
							</p:toolbarGroup>
						</p:toolbar>
					</div>
				</div>

				<div class="ShadowBox whiteback ui-fluid">

					<div class="Container100">
						<div class="Container100 Responsive100">
							<div class="ContainerIndent"
								style="padding-left: 0px; padding-right: 0px;">
								<div
									class="ui-panelgrid-content ui-widget-content ui-grid ui-grid-responsive">
									<div class="ui-grid-row">
										<div class="ui-panelgrid-cell ui-grid-col-6"
											style="padding: 4px 10px;">
											<p:selectOneMenu
												value="#{adicionarAgenciaBean.agencia.banco}">
												<f:selectItem
													itemLabel="#{msg.agencia_placeholder_numero_banco}"
													itemValue="" />
												<f:selectItems value="#{adicionarAgenciaBean.bancos}"
													var="banco" itemValue="#{banco}"
													itemLabel="#{banco.numero} - #{banco.nome}">
												</f:selectItems>
											</p:selectOneMenu>
										</div>
										<div class="ui-panelgrid-cell ui-grid-col-2"
											style="padding: 4px 10px;">
											<p:inputText value="#{adicionarAgenciaBean.agencia.numero}"
												placeholder="#{msg.agencia_placeholder_numero}"
												required="true" />
										</div>
										<div class="ui-panelgrid-cell ui-grid-col-2"
											style="padding: 4px 10px;">
											<p:inputText
												value="#{adicionarAgenciaBean.agencia.digitoVerificador}"
												placeholder="#{msg.agencia_placeholder_digitoverificador}" />
										</div>
									</div>
									<div class="ui-grid-row">
										<div class="ui-panelgrid-cell ui-grid-col-5"
											style="padding: 4px 10px;">
											<p:inputText
												value="#{adicionarAgenciaBean.agencia.descricao}"
												placeholder="#{msg.agencia_placeholder_referencia_agencia}" />
										</div>
										<div class="ui-panelgrid-cell ui-grid-col-2"
											style="padding: 4px 10px;">
											<p:inputMask mask="(99) 9999-9999"
												value="#{adicionarAgenciaBean.agencia.telefoneContato}"
												placeholder="#{msg.agencia_placeholder_tel_contato}" />
										</div>
										<div class="ui-panelgrid-cell ui-grid-col-3"
											style="padding: 4px 10px;">
											<p:inputText
												value="#{adicionarAgenciaBean.agencia.pessoaContato}"
												placeholder="#{msg.agencia_placeholder_falar_com}" />
										</div>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>

				<p:confirmDialog id="confirm-dialog-sair-tela" global="true"
					showEffect="fade" hideEffect="fade">
					<p:commandButton value="#{msg.btn_modal_sim}" type="button"
						styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
					<p:commandButton value="#{msg.btn_modal_nao}" type="button"
						styleClass="ui-confirmdialog-no" icon="ui-icon-close" />
				</p:confirmDialog>
			</h:form>

		</div>

	</ui:define>

</ui:composition>'

Olá, você já debugou o seu método getBancos() {...} , para ver se ele esta retornando alguma coisa ?

No cadastro o selectOneMenu já esta vindo com os dados que você precisa ?

olá @jorgedanilo obrigado por responder, verifiquei sim cara o combobox já vem preenchido com todos os bancos, e o objeto agência que possui um banco como atributo também está todo preenchido, ou seja, o atributo banco do objeto agência está preenchido com o banco no qual eu fiz o relacionamento com essa agência. O mais incrível de tudo é que na tela de cadastro de Contas onde tem o mesmo cenário só que o combobox em vez de possuir objetos bancos possui objetos Agência está setando corretamente quando eu clico em editar uma conta o combobox já vem setado com a agência que está vinculada a essa conta.

Bem o problema erá no método equals e hashcode que o eclipse tava gerando, não sei dizer ao certo o que realmente erá o problema já que para as outras classes que eram usadas no selectOneMenu tudo funcionava, ai depois de tanto me estressar com isso resolvi usar a IDE IntelliJ IDEA e gerar o equals e hascode por la, e quando fiz isso passou a funcionar corretamente.