pessoal,
tenho um formulário que seus campos formam várias tabelas, numa dessas tabelas é que tenho centralizado todas as chaves estrangeiras das outras tabelas, nenhuma outra recebe FK além dessa.
Quero fazer um dadastro desse formulário e popular 4 tabelas no banco, mas estou com dificuldade em como fazer para num cadstro só(formulário), criar e pegar as PK das tabelas e completar na tabela onde centraliza as FK.
Normalmente se faz uma série de cadastros e em seguida une um registro no outro, exemplo: cadatra-se um colégio e quando cadastrar um aluno, aponta-se para o colégio, mas no meu caso é tudo de uma vez só e usa 4 tabelas.
dá para entender o que quero?
[quote=daquinho]pessoal,
tenho um formulário que seus campos formam várias tabelas, numa dessas tabelas é que tenho centralizado todas as chaves estrangeiras das outras tabelas, nenhuma outra recebe FK além dessa.
Quero fazer um dadastro desse formulário e popular 4 tabelas no banco, mas estou com dificuldade em como fazer para num cadstro só(formulário), criar e pegar as PK das tabelas e completar na tabela onde centraliza as FK.
Normalmente se faz uma série de cadastros e em seguida une um registro no outro, exemplo: cadatra-se um colégio e quando cadastrar um aluno, aponta-se para o colégio, mas no meu caso é tudo de uma vez só e usa 4 tabelas.
dá para entender o que quero?[/quote]
usar transação?
Eu acreidito que persistir seus objetos é uma boa opção.
Usar um framework de persistência como hibernate será uma boa opção.
Acho que isso ajuda:
po… show de bola, vlw Wagner.
na linha 13 o “ResultSet rs = stmt.getGeneratedKeys()” mata o meu problema.
muito obrigado.
pessoal, não sei o que é transação, já li essa palavra mas não busquei sobre e usar framework é muito para essa aplicação(apesar de não parecer com a minha dúvida).
[quote=daquinho]po… show de bola, vlw Wagner.
na linha 13 o “ResultSet rs = stmt.getGeneratedKeys()” mata o meu problema.
muito obrigado.
pessoal, não sei o que é transação, já li essa palavra mas não busquei sobre e usar framework é muito para essa aplicação(apesar de não parecer com a minha dúvida).[/quote]
é um assunto de extrema importancia, se tratando de banco de dados… isso difere de SGBD para SGBD, em geral leia: http://postgresqlbr.blogspot.com/2007/05/transaes-no-postgresql.html eh parao SGBD postgresql, tah MUITO resumido, mas já da pra ter uma noção…
pro seu caso é importante usar transação pois evitar inconsistencia de dados e etc etc, tanto para uso de JDBC quanto qualquer framework de persistencia… até mais
foi mal, lembrei transação…
iii pessoal, a dica parece ser boa mas eu travei logo em seguida, se liga…
/**
* @param contato
* @return retorna um valor inteiro, que é a chave primária cadastrada
*/
public int cadastrar(Contato contato){
int pk = -1;
String sql = "insert into contato(nome,segundonome,sobrenome,descricao) values (?,?,?,?)";
try {
preparedStatement = dao.getConexao().prepareStatement(sql);
preparedStatement.setString(1,contato.getNome());
preparedStatement.setString(2,contato.getSegundoNome());
preparedStatement.setString(3,contato.getSobreNome());
preparedStatement.setString(4,contato.getDescricao());
preparedStatement.executeUpdate();
ResultSet rs = preparedStatement.getGeneratedKeys();
if(rs.next()){
pk = rs.getInt(1);
}
dao = null;
} catch (SQLException ex) {
ErroAgenda.exibirMensagemErro("impossível cadastrar:\n"+ex);
}
return pk;
}
o ResultSet sempre está recebendo null, eu n sei muito de debug mas tento… vou conferindo e quando chega no rs ele recebe null. Não tem nada fechando antes dele receber o valor de getGeneratedKeys() e ainda sim para a minha aplicação, nem ao menos entra no catch que eu criei, o erro que me retorna é o NullPointException para o ResultSet.
quem sabe como me ajudar a fazer esse rs receber o getGeneratedKeys() ?
tentei a propriedade statica PreparedStatement.RETURN_GENERATED_KEYS ? não entendi exatamento no doc e fui testar, ela retrona 1, acho q ela retorna o n de registros alterados…
completando…
os registros são sempre cadastrados e dão erro no if que tem o rs, esse rs não recebe nada, fica nulo, a aplicação para lançando um NullPointerException sem cair no meu catch. A Aplicação se encerra.
alterações…
add mais catch com NullPointException, esse ficou por último e agora está capturando mas não consigo executar o método “preparedStatement.getResultSet().cancelRowUpdates();” e continua na mesma…
tb alterei o retrono do método para se adequar ao tipo da PK q é um long e um ResultSet no scopo maior do método
public long cadastrar(Contato contato){
ResultSet rs;
long pk = -1;
String sql = "insert into contato(nome,segundonome,sobrenome,descricao) values (?,?,?,?)";
try {
preparedStatement = dao.getConexao().prepareStatement(sql);
preparedStatement.setString(1,contato.getNome());
preparedStatement.setString(2,contato.getSegundoNome());
preparedStatement.setString(3,contato.getSobreNome());
preparedStatement.setString(4,contato.getDescricao());
preparedStatement.executeUpdate();
rs = preparedStatement.getResultSet();
rs.getStatement().getGeneratedKeys();
System.out.println("dentro try 4");
if(rs.next()){
pk = rs.getInt(1);
}
//dao = null;
} catch (SQLException ex) {
try {
preparedStatement.getResultSet().cancelRowUpdates();
JOptionPane.showMessageDialog(null, "Cancelado","ERRO",JOptionPane.OK_OPTION);
}
catch (SQLException ex1) {
}
ErroAgenda.exibirMensagemErro("impossível cadastrar:\n"+ex);
} catch(NullPointerException ex){
try {
preparedStatement.getResultSet().cancelRowUpdates();
} catch (SQLException ex1) {
}
}
return pk;
}
consegui…
quando se instância o Statement ou o PreparedStatement, deve-se colocar tb como parametro statico RETURN_GENERATED_KEY para habilitar o getGeneratedKey(), por isso que não retornava nada.