Lista de chave estrangeira

2 respostas
javaarraylist
marlonmsilva

Olá pessoal!
Depois de muito tempo, voltei a estudar Java e recomecei junstamente pelo básico do básico. O bom e velho CRUD de País, Estado e Cidades;
Nesse momento estou encontrando dificuldades para listar os Estados juntamente com seus Países.
Infelizmente no campo País está vindo como null, e já tentei de todas as formas.
Peço-vos auxílio nesse tópico.
Seguem os fontes das minhas classes para análise.
Obrigado.

Classe Estado

package br.com.brassicales.localizacao;

public class Estado {
	
	private int codigo;
	private String nome, sigla;
	private Pais pais;
	
	public int getCodigo(){
		return this.codigo;
	}
	public void setCodigo(int codigo){
		this.codigo = codigo;
	}
	public String getNome(){
		return this.nome;
	}
	public void setNome(String nome){
		this.nome = nome;
	}
	public String getSigla(){
		return this.sigla;
	}
	public void setSigla(String sigla){
		this.sigla = sigla;
	}
	public Pais getPais(){
		return this.pais;
	}
	public void setPais(Pais pais){
		this.pais = pais;
	}
}

Classe EstadoDao

package br.com.brassicales.localizacao.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.brassicales.jdbc.ConnectionFactory;
import br.com.brassicales.localizacao.Estado;
import br.com.brassicales.localizacao.Pais;

public class EstadoDao {
	
	public Connection connection;
	
	public EstadoDao(){
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Estado estado){

		String sql = "insert into estado(nome, sigla, pais) values (?,?,?)";
		
		try{
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, estado.getNome().toUpperCase());
			stmt.setString(2, estado.getSigla().toUpperCase());
			stmt.setObject(3, estado.getPais().getCodigo());
			
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		
	}
	public List<Estado> gelista(){
		List<Estado> estados = new ArrayList<>();
		try{
			
			PreparedStatement stmt = this.connection.prepareStatement("select * from estado");
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				Estado estado = new Estado();
				Pais pais = new Pais();
				estado.setPais(pais);
				
				estado.setCodigo(rs.getInt("codigo"));
				estado.setNome(rs.getString("nome"));
				estado.setSigla(rs.getString("sigla"));
				pais.setCodigo(rs.getInt("codigo"));
				
				estados.add(estado);
				
			}
				stmt.executeQuery();
				stmt.close();

		} catch(SQLException e){
			throw new RuntimeException(e);
		}
		
		return estados;
	}
	public void altera(Estado estado){
		
		String sql = "update estado set nome=?, sigla=?, pais=? where codigo=?";
		try{
			
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, estado.getNome().toUpperCase());
			stmt.setString(2, estado.getSigla().toUpperCase());
			stmt.setObject(3, estado.getPais().getCodigo());
			stmt.setInt(4, estado.getCodigo());
			
			stmt.execute();
			stmt.close();
			
		} catch(SQLException e){
			throw new RuntimeException(e);
		}
		
	}
	public void remove(Estado estado){
		
		String sql = "delete from estado where codigo=?";
		try{
			
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setInt(1, estado.getCodigo());
			
			stmt.execute();
			stmt.close();
			
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
		
	}
}

Classe ListaEstado

package br.com.brassicales.localizacao.crud;

import java.util.List;
import br.com.brassicales.localizacao.Estado;
import br.com.brassicales.localizacao.Pais;
import br.com.brassicales.localizacao.dao.EstadoDao;

public class ListaEstado {
	
	public static void main(String[] args) {
		
		EstadoDao estadoDao = new EstadoDao();
		List<Estado> estados = estadoDao.gelista();
		
		Estado estado = new Estado();
		Pais pais = new Pais();
		estado.setPais(pais);
		
		for(Estado listaEstado : estados){
			System.out.println("Código: " + listaEstado.getCodigo());
			System.out.println("Nome: " + listaEstado.getNome());
			System.out.println("Sigla " + listaEstado.getSigla() + "\n");
			
			System.out.println("País: " + listaEstado.getPais().getNome());
			System.out.println("País: " + estado.getPais().getNome());
			System.out.println("País: " + pais.getNome() + "\n");
		}
	}
}

Na classe ListaEstado estão os três métodos que utilizei para imprimir o nome do País do Estado, mas não consegui. Antes de tudo, quero dizer que tentei encontrar algo relacionado aqui no GUJ, porém, sem sucesso. Acho que eu mesmo já abri um tópico desses, mas isso foi há 5 anos e não mais os encontrei.

2 Respostas

Sandro_Machado

Seu loop que insere os estados na Lista está dando um setCodigo() 2 vezes

while(rs.next()){
	Estado estado = new Estado();
	Pais pais = new Pais();
	estado.setPais(pais);
				
	estado.setCodigo(rs.getInt("codigo"));
	estado.setNome(rs.getString("nome"));
	estado.setSigla(rs.getString("sigla"));
	pais.setCodigo(rs.getInt("codigo"));
				
	estados.add(estado);

assim você está setando um objeto Pais, com o código do estado, e não está fazendo nada com ele.

pais.setCodigo(rs.getInt("codigo"));

penso que tem, fazer uma query de pesquisa pela chave estrangeira do Pais, e então instanciar um Pais com o resultado, e dai sim setar o Estado com o Pais relacionado.

estado.setPais(objetoPais);
marlonmsilva

Obrigado a todos pelo auxílio.
Depois de algumas modificações, consegui realizar fazer o código funcionar.
Segue para consulta:
Pais.java

`
public class Pais {

// Variáveis para classe Pais.
private int codigo;
private String nome;
private String sigla3;
private String codigoTelefone;
private String siglaInternet;

// Getters and Setters para os atributos da classe Pais.
public int getCodigo() {
	return this.codigo;
}
public void setCodigo(int codigo) {
	this.codigo = codigo;
}
public String getNome() {
	return this.nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getSigla3() {
	return this.sigla3;
}
public void setSigla3(String sigla3) {
	this.sigla3 = sigla3;
}
public String getCodigoTelefone(){
	return this.codigoTelefone;
}
public void setCodigoTelefone(String codigoTelefone){
	this.codigoTelefone = codigoTelefone;
}
public String getSiglaInternet(){
	return this.siglaInternet;
}
public void setSiglaInternet(String siglaInternet){
	this.siglaInternet = siglaInternet;
}

// Construtor para a classe Pais e construtor para Pais passando atributo nome como parâmetro.
public Pais(){
}
public Pais(int codigo){
	this.codigo = codigo;
}
public Pais(String nome){
	this.nome = nome;
}

}
`

Estado.java
`

public class Estado {

private int codigo;
private String nome, sigla;
private Pais pais;

public int getCodigo(){
	return this.codigo;
}
public void setCodigo(int codigo){
	this.codigo = codigo;
}
public String getNome(){
	return this.nome;
}
public void setNome(String nome){
	this.nome = nome;
}
public String getSigla(){
	return this.sigla;
}
public void setSigla(String sigla){
	this.sigla = sigla;
}
public Pais getPais(){
	return this.pais;
}
public void setPais(Pais pais){
	this.pais = pais;
}
public Estado(){
}
public Estado(String nome){
	this.nome = nome;
}

}`

EstadoDao.java
`

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

public class EstadoDao {

public Connection connection;

public EstadoDao(){
	this.connection = new ConnectionFactory().getConnection();
}

public void adiciona(Estado estado){

	String sql = "insert into estado (nome, sigla, pais) values (?,?,?)";
	
	try{
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setString(1, estado.getNome().toUpperCase());
		stmt.setString(2, estado.getSigla().toUpperCase());
		stmt.setObject(3, estado.getPais().getCodigo());
		
		stmt.execute();
		stmt.close();
		connection.close();
		
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}
public List<Estado> gelista(){
	List<Estado> estados = new ArrayList<>();
	try{
		
		PreparedStatement stmt = this.connection.prepareStatement(
				"select e.codigo, e.nome, e.sigla, p.nome "
				+ "from estado e inner join pais p on e.pais = p.codigo");
		ResultSet rs = stmt.executeQuery();
		
		while(rs.next()){
			Estado estado = new Estado();
			Pais pais = new Pais();
			estado.setPais(pais);
			
			estado.setCodigo(rs.getInt("e.codigo"));
			estado.setNome(rs.getString("e.nome"));
			estado.setSigla(rs.getString("e.sigla"));
			estado.setPais(new Pais(rs.getString("p.nome")));
			
			
			estados.add(estado);
			
		}
			rs.close();
			stmt.executeQuery();
			stmt.close();
			connection.close();

	} catch(SQLException e){
		throw new RuntimeException(e);
	}
	
	return estados;
}
public void altera(Estado estado){
	
	String sql = "update estado set nome=?, sigla=?, pais=? where codigo=?";
	try{
		
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setString(1, estado.getNome().toUpperCase());
		stmt.setString(2, estado.getSigla().toUpperCase());
		stmt.setObject(3, estado.getPais().getCodigo());
		stmt.setInt(4, estado.getCodigo());
		
		stmt.execute();
		stmt.close();
		connection.close();
		
	} catch(SQLException e){
		throw new RuntimeException(e);
	}
}
public void remove(Estado estado){
	
	String sql = "delete from estado where codigo=?";
	try{
		
		PreparedStatement stmt = connection.prepareStatement(sql);
		stmt.setInt(1, estado.getCodigo());
		
		stmt.execute();
		stmt.close();
		connection.close();
		
	}catch(SQLException e){
		throw new RuntimeException(e);
	}
}

}

ListaEstado.java

public class ListaEstado {

public static void main(String[] args) {
	
	EstadoDao estadoDao = new EstadoDao();
	List<Estado> estados = estadoDao.gelista();
	
	Estado estado = new Estado();
	Pais pais = new Pais();
	estado.setPais(pais);
	
	for(Estado listaEstado : estados){
		System.out.println("Código: " + listaEstado.getCodigo());
		System.out.println("Nome: " + listaEstado.getNome());
		System.out.println("Sigla " + listaEstado.getSigla());
		System.out.println("País: " + listaEstado.getPais().getNome() + "\n");
	}
}

}
`

Criado 24 de agosto de 2016
Ultima resposta 26 de ago. de 2016
Respostas 2
Participantes 2