Gravar objectos na banco de dados

Bom dia pessoal,

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");
	}

agradeco desde ja a todos…

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.

coloque aqui os erros que aparece no seu console.

Ja tentou executar em modo debug e verificar onde esta gerando o erro?

Obrigado pela dica

é 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

// inserir

	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());

			statement.execute();
			statement.close();

		} catch (SQLException e) {
			throw new RuntimeException("Bug ao inserir");
		}

	}

}

mais uma vez, thank you!

Cara,

como Encomenda é uma tabela, vc vai ter que fazer outro insert nesta tabela, do jeito que vc ta fazendo ai ta errado.

t+

Oi,

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 :slight_smile:
Podem haver outras mas não me vieram a mente no momento.

alissonvla , com assim? nao percebi.

vc vai fazer o seguinte

// inserir

	public void inserir(Cliente cliente) {

		String sql = "INSERT INTO cliente (id, nome, email) VALUES (?,?,?)";

		try {

			PreparedStatement statement = connection.prepareStatement(sql);

			statement.setInt(1, cliente.getId());
			statement.setString(2, cliente.getNome());
			statement.setString(3, cliente.getEmail());

			statement.execute();


                       sql = "INSERT INTO Encomenda(id, cliente,...) VALUES (?,?,...)";
                       statement = connection.prepareStatement(sql);
                       // e por ai vai

			statement.close();

		} catch (SQLException e) {
			throw new RuntimeException("Bug ao inserir");
		}

	}

}

espero ter te ajudado.

nel, podes explicar melhor a tua primeira opcao, ser um pouco mais detalhista?Talvez seja da linguagem ai do Brasil que eu nao percebi esta parte

1 - Quebre o objeto e o persista em uma nova tabela, parametro a parametro;

alterei aqui statement.setInt(4, cliente.getEncomenda().getId()); e o compliador paraou de “chorar”

em anexo esta a minha tabela…


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()); // mudei aqui

			statement.execute();
			statement.close();

		} catch (SQLException e) {
			throw new RuntimeException("Bug ao inserir");
		}

	}


[quote=El]alterei aqui statement.setInt(4, cliente.getEncomenda().getId()); e o compliador paraou de “chorar”

em anexo esta a minha tabela…

[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()); // mudei aqui

		statement.execute();
		statement.close();

	} catch (SQLException e) {
		throw new RuntimeException("Bug ao inserir");
	}

}

[/code][/quote]

É 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.

Não entendi sua dúvida nessa parte.

este statment cliente.getEncomenda().getId()); é o mesmo que objeto.metodo1.metodo2/ Agradecia que me explicasses a logica dessa instrucao, sintaticamente/

Veja:

[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 :slight_smile:

Ok nel,

obrigadaco! Gostei muito da tua explicacao.