Problema com relacionamento no Spring

5 respostas
acdelemos

Olá pessoal.

Estou com um problema que deve ser bem básico e idiota mas já busquei na internet uma solução e ainda não encontrei então resolvi perguntar para os que tem mais experiência que eu.
Tenho o meu modelo Cidade e Estado com listado abaixo:

public class Cidade {

	private int id;
	private String nome;
	private String cep;
	private Estado estado;

//GETs e SETs

}
public class Estado {
	
	private int id;
	private String nome;
	private String sigla;

//GETs e SETs

}

E na minha classe CidadeDao da seguinte maneira:

@Repository(value="cidadeDao")
public class CidadeDao extends SimpleJdbcDaoSupport 
		implements CidadeRepository {
	
	private SimpleJdbcTemplate simplejdbcTemplate;
	
	@Autowired
	public void setSimpleJdbcTemplate(DataSource dataSource) {
		this.simplejdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
	
	@SuppressWarnings("unchecked")
	public List<Cidade> listar() {
		String sql =  "select c.id, c.nome, c.cep, e.sigla ";
		       sql += "from cidade c, estado e  ";
		       sql += "where e.id = c.estado_id ";
		List<Cidade> cidades = getSimpleJdbcTemplate().query(sql, new CidadeRowMapper());		       
		return cidades;
	}

}

E a minha classe de CidadeRowMapper da seguinte maneira:

public class CidadeRowMapper implements ParameterizedRowMapper<Cidade> {
	
	public Cidade mapRow(ResultSet rs, int rowNum) throws SQLException {
		Cidade cid = new Cidade();
		cid.setId(rs.getInt("ID"));
		cid.setNome(rs.getString("NOME"));
		cid.setCep(rs.getString("CEP"));
		cid.setEstado(rs.getInt("ESTADO_ID"));
		return cid;	
	}
}

E a implementação de CidadeServiceImpl

@Service(value="cidadeService")
@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public class CidadeServiceImpl  implements CidadeService {
	
	private CidadeRepository cRepository;
	
	@Autowired
	public void setCidadeRepository(CidadeRepository cidadeRepository) {
		this.cRepository = cidadeRepository;
	}
	
	public List<Cidade> listar() throws Exception {
		try {	
			return this.cRepository.listar();
		} catch (Exception e) {
			throw new Exception("Não foi possível listar. "+e.getMessage());
		}
	}

}

Quando executo o método listar() recebo a lista de cidades mas com a coluna sigla em branco, se alguém puder ajudar fico grato. Estou usando Spring 2.5 com anotações e SimpleJdbcTemplate.

Desde já agradeço a ajuda.

Antonio

5 Respostas

furutani

Olá!

Em algum momento você tem que buscar a sigla no banco de dar um setSigla(rs.getString(“Sigla”)).

acdelemos

Desculpe furutani eu não entendi direito a sua resposta.
Eu já não estou bucando a sigla quando executo o seguinte comando sql abaixo:

String sql =  "select c.id, c.nome, c.cep, e.sigla ";  
         sql += "from cidade c, estado e  ";  
         sql += "where e.id = c.estado_id ";

Antonio

nebal.metz

Opa.

Tche, faltou na tua classe CidadeRowMapper set o sigla.
Na sua query voce busca ela, mas na RowMapper voce nao seta ela.

public class CidadeRowMapper implements ParameterizedRowMapper<Cidade> {  
       
     public Cidade mapRow(ResultSet rs, int rowNum) throws SQLException {  
         Cidade cid = new Cidade();  
         cid.setId(rs.getInt("ID"));  
         cid.setNome(rs.getString("NOME"));  
         cid.setCep(rs.getString("CEP"));  
         cid.setEstado(rs.getInt("ESTADO_ID"));  
         // faltou setar o sigla abaixo.
         cid.setEstado(rs.getInt("SIGLA"));  


         return cid;   
     }
:)
acdelemos

Obrigado pela ajuda nebal, porém o campo estado é de um objeto Estado e a sigla é um String desta maneira não vai rolar, acredito estou quase la.

nebal.metz

Mas seu problema como reportou era que o campo sigla vinha em branco.
Pelo que descreve o atributo sigla é uma string da classe Estado.
Se voce quiser atribuir o campo sigla da Classe Estado faz o seguinte:

public class Cidade {

	private int id;
	private String nome;
	private String cep;
        // tu pode criar aqui o Objeto Estado, ou dento do RowMapper.
	private Estado estado = new Estado();

//GETs e SETs

}

Classe RowMapper:

public class CidadeRowMapper implements ParameterizedRowMapper<Cidade> {
	
	public Cidade mapRow(ResultSet rs, int rowNum) throws SQLException {
		Cidade cid = new Cidade();
		cid.setId(rs.getInt("ID"));
		cid.setNome(rs.getString("NOME"));
		cid.setCep(rs.getString("CEP"));
                // se voce nao usou o contrutor dentro do bean Cidade Instancia o Objeto Estado e depois seta ele como abaixo.
		cid.getEstado.setSigla(rs.getString("SIGLA"));

               // pelo seu sql, voce nao consegue alimentar seu objeto estado apenas pelo ESTADO_ID.
              // se quiser fazer isso, vai ter q incluir o id do estado e dentro do RowMapper vai ter iterar sobre um Objeto Estado.
               cid.setEstado(rs.getInt("ESTADO_ID"));
		return cid;	
	}
}

:)

Criado 31 de agosto de 2008
Ultima resposta 1 de set. de 2008
Respostas 5
Participantes 3