Estou desenvolvendo um sistema de livraria. No pacote de modelacao tenho Classes - Atributos:
Livro - id (para banco de dados), tituo; autor, ano, isbn;
Cliente - nome, email, encomenda (tipo Livro) -,
Encomenda - cliente (tipo cliente ) e outros
Venda - preco; data e outros.
Criei DAO para todas esses classes, estou a ter dificuldades no ClienteDAO e noutros DAOs cuja classe contem atributos do tipo nao primitivo.
Abaixo deixo um exemplo para dar uma ideia do que esta acontecer[color=green] [/color]
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, cliente.getId());
statement.setString(2, cliente.getNome());
statement.setString(3, cliente.getEmail());
// o baug esta aqui! Nao sei como fazer no lugar do setInt, como o mysql nao conhce objectos...
statement.setInt(4, cliente.getEncomenda());
statement.execute();
statement.close();
} catch (SQLException e) {
throw new RuntimeException("Bug ao inserir");
}
1° Cara se você for postar códigos sempre, mais sempre mesmo use as tags [code], assim fica mais fácil de entender seus códigos.
2° O que você vai salvar no banco de dados não é o objeto em si -Pelo menos foi isso que eu entendi no seu código-, o que vai salvar é o “id” ou identificador de uma encomenda.
é assim, no trcho de codigo a baixo esta um metodo que eu gostaria que inseri-se um cliente no base de dados (estou usando mysql). o meu problema esta na linha boldada :
statement.setInt(4, cliente.getEncomenda()); no lugar de setInt o que ponho, porque a encomenda e do tipo Livro e nao do tipo int
via JDBC o PreparedStatement possui um método chamado setObject. Todavia, eu nunca usei e de acordo com a documentação, conforme link, o Objeto passado deve implementar interfaces específicas para que o Driver SQL efetue a correta conversão do Objeto para um tipo SQL.
Eu vejo três opções para o seu caso:
1 - Quebre o objeto e o persista em uma nova tabela, parametro a parametro;
2 - Faça com que ele implemente alguma das interfaces citadas no link, como um Blob da vida;
3 - Altere a camada de JDBC para JPA que você em uma linha faz isso e persiste diretamente o objeto, desde que ele seja um Entity.
Recomendo ainda a primeira opção
Podem haver outras mas não me vieram a mente no momento.
É isso que eu quis dizer, talvez eu tenha me expressado muito mal.
Você não inseriu diretamente o objeto cliente, você efetuou os gets e persistiu item a item, é o correto para JDBC.
nel, veja o comentario contido no codigo abaixo. obrigado pela ajuda
[code]public void inserir(Cliente cliente) {
String sql = "INSERT INTO cliente (id, nome, email, encomenda) VALUES (?,?,?,?)";
try {
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, cliente.getId());
statement.setString(2, cliente.getNome());
statement.setString(3, cliente.getEmail());
statement.setInt(4, cliente.getEncomenda().getId()); // mas esse getId e metodo da classe Livro, que o cliente encomenda
statement.execute();
statement.close();
} catch (SQLException e) {
throw new RuntimeException("Bug ao inserir");
}
}[/code]
E qual o problema nisso ?
Após inserido o Livro você insere o Cliente. É uma ligação entre suas tabelas, está correto inserir o ID do livro no Cliente, desse forma, sabe que o Cliente possui aquele livro.
este statment cliente.getEncomenda().getId()); é o mesmo que objeto.metodo1.metodo2/ Agradecia que me explicasses a logica dessa instrucao, sintaticamente/
[code]public class Cliente {
private Encomenda encomenda;
private String nome;
public String getNome() {
return nome;
}
public Encomenda getEncomenda() {
return livro;
}
}[/code]
Não adicionei os setters. Mas isto é conhecido com associação, você faz com que dois ou mais objetos possuam uma ligação entre eles.
Nesse caso, está dizendo que o objeto Cliente vai possuir um objeto Encomenda em sua composição.
Dentro do objeto Encomenda podem ter n métodos publicos, basta ter a instancia dele.
Por isso fazendo:
cliente.getEncomenda().getId()
É possível. Isso é muito usado, principalmente para efeutar relacionamentos, como é o seu caso