Duvida com relacionamento entre tabelas

Ola a todos,
estou tentando fazer meu primeiro programa em jsp e estou com dificuldade no relacionamento entre as tabelas.
Tenho uma tabela de cliente que tem um relacionamemto com uma tabela Uf(estados).E não sei como fazer o Dao dessa chave estrangeira

Esta é a classe uf
public class Uf {
    private long id;
    private String estado;

getter e setters

essa é a clientes

public class Cliente {

    private long id;
    private String nome;
    private String logradouro;
    private String complemento;
    private String bairro;
    private String telefone;
    private String celular;
    private String cep;
    private Uf iduf;

getters e setters

e aqui o dao onde é a minha duvida

  public void adiciona(Cliente cliente) {
String sql = "insert into cliente(nome,logradouro,complemento,bairro,telefone,celular,cep,uf_id)  values (?,?,?,?,?,?,?,?)";
try {
// prepared statement para inserção
PreparedStatement stmt = connection.prepareStatement(sql);
// seta os valores
stmt.setString(1,cliente.getNome());
stmt.setString(2,cliente.getLogradouro());
stmt.setString(3,cliente.getComplemento());
stmt.setString(4,cliente.getBairro());
stmt.setString(5,cliente.getTelefone());
stmt.setString(6,cliente.getCelular());
stmt.setString(7,cliente.getCep());

// executa
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}

como faria a o stmt para o id da uf? ou isso é errado?
minha ideia é cadastrar os estados nessa tabela para ser escolhido na hora do cadastro.
Estou começando agora e tenho algumas duvidas essa é uma delas.
Obrigado.

Como você ta usando JDBC direto, vai ter que ser tudo no braço…

Ao meu ver você deveria fazer assim:

1- Instancie a classe Cliente;
2 - Pela simplicidade da Classe Uf, você poderia carrega-la em um Map<String, Integer> listaUF, que vai guardar a UF e o ID dos estados, provavelmente você vai precisar ordernar essa lista pela UF, talvez seria bom você usar um TreeMap (tem tópicos aqui como ordenar listas e Collections), esta lista servira tambem para alimentar um combo onde será armazenado o estado escolhido;
3 - Puxe desse Map o ID do UF quando for gravar na tabela de Clientes, Ex: stmt.setString(8, listaUF.get(“string da UF que estará no combo”);

Você pode fazer o relacionamento de várias maneiras.

A primeira solução é criar uma consulta sql com todos os campos que você precisa e preencher os objetos. Exemplo:

public List loadClientes(){

	//Consulta sql e statements

	while(rs.next()){
		Cliente cliente = new Cliente();
		Uf uf = new Uf();

		cliente.setId(rs.getInt("id"));
		//preencher outros atributos do cliente com o resultset
		uf.setId(rs.getInt("uf_id"));
		uf.setEstado(rs.getString("uf_estado"));
		cliente.setUf(uf);

		clientes.add(cliente);
	}
	return clientes;
}

A outra solução é criar uma consulta somente para as Ufs. Por exemplo:


public List loadClientes(){

	//Consulta sql e statements

	while(rs.next()){
		Cliente cliente = new Cliente();

		cliente.setId(rs.getInt("id"));
		//preencher outros atributos do cliente com o resultset
		cliente.setUf(loadUf(rs.getInt("uf_id"))));

		clientes.add(cliente);
	}
return clientes;
}

public Uf loadUf(int id){
	Uf uf = new Uf();

	//Consulta sql e statements usando o parametro

	while(rs.next()){
		uf.setId(rs.getInt("id"));
		uf.setEstado(rs.getString("estado"));
	}
	return uf;
}

Mas a melhor solução para esse caso é criar o campo uf com dois caracteres na tabela cliente, salvar a sigla da UF neste campo e criar um Enum Estado com UF e Nome.

guarda o id do estado na tabela clientes

cria um método chamado getUfByID(int id){// consulta //} : String UF;

e use esse método quando for carregar clientes etc…

Existem várias maneiras de se fazer Neston, rsrsrs

[quote=wendel2s]Você pode fazer o relacionamento de várias maneiras.

A primeira solução é criar uma consulta sql com todos os campos que você precisa e preencher os objetos. Exemplo:

public List loadClientes(){

	//Consulta sql e statements

	while(rs.next()){
		Cliente cliente = new Cliente();
		Uf uf = new Uf();

		cliente.setId(rs.getInt("id"));
		//preencher outros atributos do cliente com o resultset
		uf.setId(rs.getInt("uf_id"));
		uf.setEstado(rs.getString("uf_estado"));
		cliente.setUf(uf);

		clientes.add(cliente);
	}
	return clientes;
}

A outra solução é criar uma consulta somente para as Ufs. Por exemplo:


public List loadClientes(){

	//Consulta sql e statements

	while(rs.next()){
		Cliente cliente = new Cliente();

		cliente.setId(rs.getInt("id"));
		//preencher outros atributos do cliente com o resultset
		cliente.setUf(loadUf(rs.getInt("uf_id"))));

		clientes.add(cliente);
	}
return clientes;
}

public Uf loadUf(int id){
	Uf uf = new Uf();

	//Consulta sql e statements usando o parametro

	while(rs.next()){
		uf.setId(rs.getInt("id"));
		uf.setEstado(rs.getString("estado"));
	}
	return uf;
}

Mas a melhor solução para esse caso é criar o campo uf com dois caracteres na tabela cliente, salvar a sigla da UF neste campo e criar um Enum Estado com UF e Nome.[/quote]

seria mais ou menos isso?

Gostei da solução com enum parece bem legal, mas peguei esse exemplo bem simples da UF para aprender esses relacionamentos entre tabelas(ta feia a coisa).
Agora ainda não sei como fazer com o ClientesDao, a minha ideia é criar uma lista na pagina já com os campos da uf relativos ao da tabela UF
desculpa a pertubação, mas estou começando agora.

Cara,

pelo seu código existe uma instância da classe Uf dentro da classe cliente. Certo?

Eu suponho que a tabela UF será alimentada antes da inclusão de um cliente.

Neste caso vc poderia fazer o seguinte:

 public  void adiciona(Cliente cliente) {  
 String sql = "insert into cliente(nome,logradouro,complemento,bairro,telefone,celular,cep,uf_id)  values (?,?,?,?,?,?,?,?)";  
 try {  
 // prepared statement para inserção  
 PreparedStatement stmt = connection.prepareStatement(sql);  
 // seta os valores  
 stmt.setString(1,cliente.getNome());  
 stmt.setString(2,cliente.getLogradouro());  
 stmt.setString(3,cliente.getComplemento());  
 stmt.setString(4,cliente.getBairro());  
 stmt.setString(5,cliente.getTelefone());  
 stmt.setString(6,cliente.getCelular());  
 stmt.setString(7,cliente.getCep());  
[b] stmt.setString(8,cliente.getUf().getIdUF()); [/b]
   
 // executa  
 stmt.execute();  
 stmt.close();  
 } catch (SQLException e) {  
 throw new RuntimeException(e);  
 }  
 }