vRaptor - Recuperar Objeto a partir do Id

Bem, possuo um combobox de estade e cidade pronto e funcionando, atualmente se encontram assim:

no name="visitante.endereco.cidade.estado" é passado o objeto que receberá o value, porem o value é o id, que nao é um objeto, como recuperar isso?

pagina formulario.jsp:

<%@ page contentType="text/html; charset=UTF-8" %>

<script>
$(document).ready(function(){  
	   $('#estadosSelect').on('change', function(){  
	      var self = $(this);  
	      var selecionado = self.val(); // pega o ID do estado  
	      $.ajax({  
	    	 url:'<c:url value="/visitante/carregaCidades/" />'+ selecionado,  
	         //data:{estado:selecionado}, // Passa a variável ao server. O nome do parâmetro tem que ser estado, pois foi o nome colocado aqui.  
	         dataType:'json', // O Server vai retornar um JSON  
	         success:function(data){  
	            // Precisa transformar de json para objeto html  
	            var options = [];  
	            options.push(' <option>Selecione</option> '); // colocando a primeira option...  
	            for (var i = 0; i < data.length; i++) {  
	               options.push('<option value="'+data[i].codigo+'">'+data[i].nome+'</option>');  
	            }  
	              
	            // Agora precisa juntar esses options dentro da combo de cidades  
	            $('#cidadesSelect').html(options.join(''));  
	         },  
	         error:function(){  
	            //alert('erro');  
	         }  
	      });  
	   });  
	});
</script>

<div>
<form action="salvar" method="post">
   <fieldset>
     <legend>Adicionar Visitante</legend>
     
     <label for="nome">Nome:</label>
     <input id="nome" type="text" placeholder="nome" name="visitante.nome"/>
     
     <label for="rua">Rua:</label>
     <input id="rua" type="text" placeholder="rua" name="visitante.endereco.logradouro" style="display: block;" />
     <fieldset style="display: inline;">
     
     <label for="descricao">estado:</label>
     <select id="estadosSelect" name="visitante.endereco.cidade.estado" style="width: 60px;">  
	   <option value="disable">UF</option>  
	   <c:forEach items="${estadoList}" var="estado">  
	      <option value="${estado.codigo}">${estado.sigla}</option>  
	   </c:forEach>  
	 </select>
     </fieldset>
     
     <fieldset style="display: inline;">
     <label for="cidade">cidade:</label>
     <select id="cidadesSelect" name="visitante.endereco.cidade">  
	 	<option>Selecione</option>
	 </select> 
     </fieldset>
     
     <br/>
     <button type="submit" class="btn">Salvar</button>
   </fieldset>
 </form>
</div>

como vocês podem ver, o value do estado é o .id, e apos a requisiçao em ajax ele monta o combobox de cidade, tbm passando o id, só que eles tao Setando um ID em um Objeto, e quando vou debugar os objetos nao vem com esses ID’s, como faço pra recuperar?

meu controllador:

public void salvar(Visitante visitante) {
		Integer codigo = visitante.getCodigo();
		if(codigo == null|| codigo == 0) {
			this.visitanteRep.save(visitante);	
		} else {
			this.visitanteRep.update(visitante);
		}
		result.redirectTo(this).listar();
	}

Você pode criar 2 converters, 1 para Cidade e outro para Estado… No construtor desse converter, você recebe o dao das classes e você pega do banco…

pessoal, antes de mais nada, acabei modificando para pegar o id. por exemplo

de

name="visitante.endereco.cidade.estado" 

para:

name="visitante.endereco.cidade.estado.codigo" 

e agora está chegando o codigo no debug, minha duvida é: é correto fazer isso e a partir desse id, recuperar o bojeto ou isso é uma forma errada?

rafael, eu pegando o codigo do jeito que tou fazendo e no metodo do controller recuperar o objeto a partir desse codigo, pode ser feito? sem precisar do converter?

rafael, como cria converters?

Evite ficar colocando várias respostas seguidas, edite e coloque mais conteúdo…

Na documentação do VRaptor:
http://vraptor.caelum.com.br/pt/docs/conversores/

Você pode usar o ID direto. EU não gosto dessa abordagem. Mas fica ao gosto do freguês…

em geral é melhor usar o id mesmo, já que isso é o suficiente pra garantir o relacionamento no bd.

na questão de deixar o codigo mais bem feito, é melhor fazer essa abordagem de pegar o id e carregar o objeto ou criar o converter lucas?

vc não precisa carregar o objeto nesse caso, pelo menos se for o Hibernate.

ué porque não? pq nesse caso meu objeto cidade só vai ter id, o nome da cidade nao aparece, e no estado somente o id ta inserido a sigla nao consta, o que eu faço é carregar.

porque nao é necessario?

achei que vc fosse já salvar no banco… se for pra mostrar na próxima tela vc pode usar o @Load (do plugin do hibernate ou da jpa, dependendo do que vc estiver usando) que já carrega pelo id.