Como cadastrar várias tabelas ao mesmo tempo

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.