Como dar o commit quando preciso inserir em duas tabelas?

Olá, Pessoal,

Estou com a seguinte dúvida... Preciso dar um insert em duas tabelas dentro do mesmo método. Esse método recebe um cliente como parametro e esse objeto do tipo cliente possui um atributo do tipo endereco.

Porem, no bd, tenho duas tabelas diferentes, uma para cliente e outra para endereço. Estou usando DAO e PreparedStatment.
Segue meu código…

 public void inserirItem(DTO dto) throws DAOException {
       if(dto != null){
           Cliente cliente = (Cliente) dto;
           String sql = "INSERT INTO cliente (nomeCompleto, razaoSocial, cpf, cnpj, " +
                   "identidade, dataNascimento, tipoPessoa) VALUES (?,?,?,?,?,?,?)";
           try{
              this.conexao = ConnectionFactory.getConnection();
              PreparedStatement ps = conexao.prepareStatement(sql);
              ps.setString(1, cliente.getNomeCompleto());
              ps.setString(2, cliente.getRazaoSocial());
              ps.setString(3, cliente.getCpf());
              ps.setString(4, cliente.getCnpj());
              ps.setString(5, cliente.getIdentidade());
              ps.setString(6, cliente.getDataNascimento());
              ps.setString(7, cliente.getTipoPessoa());
              ps.executeUpdate();
          }catch(ClassNotFoundException cnfe){
               JOptionPane.showMessageDialog(null, "ClassNotFoundException");
               cnfe.printStackTrace();
           }catch(SQLException sqle){
               sqle.printStackTrace();
               JOptionPane.showMessageDialog(null, "SQLException: " + sqle.getMessage());
           }finally{
               try{
                  this.conexao.close();
               }catch(SQLException sqle){
                   sqle.printStackTrace();
               }   
           }
       }

… ou seja, dentro desse código eu preciso dar um outro Insert e só commitar no final.

Obrigado!

Primeiro set o AutoCommit para FALSE Connection.setAutoCommit(false), depois basta Connection.commit() para aplicar as alterações.

veja mais sobre o assunto AQUI.

[quote=rafaelglauber]Primeiro set o AutoCommit para FALSE Connection.setAutoCommit(false), depois basta Connection.commit() para aplicar as alterações.

veja mais sobre o assunto AQUI.[/quote]

Show !!!

Fiz diferente… Criei os dois inserts, executei os dois e funcionou. Segue o código…

public void inserirItem(DTO dto) throws DAOException {
       if(dto != null){
           Cliente cliente = (Cliente) dto;
           String sqlCliente  = "INSERT INTO cliente (nomeCompleto, razaoSocial, cpf, cnpj, " +
                   "identidade, dataNascimento, tipoPessoa) VALUES (?,?,?,?,?,?,?);";
           String sqlEndereco = "INSERT INTO endereco (id_cliente, tipoEndereco, tipoLogradouro, logradouro, " +
                   "bairro, complemento, numero, cidade, estado, cep) VALUES (?,?,?,?,?,?,?,?,?,?);";    
           try{
              this.conexao = ConnectionFactory.getConnection();
              //INSERE CLIENTE
              PreparedStatement psCliente = conexao.prepareStatement(sqlCliente);
              psCliente.setString(1, cliente.getNomeCompleto());
              psCliente.setString(2, cliente.getRazaoSocial());
              psCliente.setString(3, cliente.getCpf());
              psCliente.setString(4, cliente.getCnpj());
              psCliente.setString(5, cliente.getIdentidade());
              psCliente.setString(6, cliente.getDataNascimento());
              psCliente.setString(7, cliente.getTipoPessoa());
              //INSERE ENDERECO
              PreparedStatement psEndereco = conexao.prepareStatement(sqlEndereco);
              psEndereco.setInt(1, obtemMaximoId() + 1);
              psEndereco.setString(2, cliente.getEndereco().getTipoEndereco());
              psEndereco.setString(3, cliente.getEndereco().getTipoDeLogradouro());
              psEndereco.setString(4, cliente.getEndereco().getLogradouro());
              psEndereco.setString(5, cliente.getEndereco().getBairro());
              psEndereco.setString(6, cliente.getEndereco().getComplemento());
              psEndereco.setString(7, cliente.getEndereco().getNumero());
              psEndereco.setString(8, cliente.getEndereco().getCidade());
              psEndereco.setString(9, cliente.getEndereco().getEstado());
              psEndereco.setString(10, cliente.getEndereco().getCep());
              //FIM DA INSERCAO
              psCliente.executeUpdate();
              psEndereco.executeUpdate();        
          }catch(ClassNotFoundException cnfe){
               JOptionPane.showMessageDialog(null, "ClassNotFoundException");
               cnfe.printStackTrace();
           }catch(SQLException sqle){
               sqle.printStackTrace();
               JOptionPane.showMessageDialog(null, "SQLException: " + sqle.getMessage());
           }finally{
               try{
                  this.conexao.close();
               }catch(SQLException sqle){
                   sqle.printStackTrace();
               }   
           }
       }      
    }

Reparem que tem um bacalhau na linha 21, mas nao encontrei uma forma de fazer isso funcionar. Alguem teria alguma sugestao?

Endereço é dependente de Cliente? Sendo dependentes tome cuidado com transação isolada, já que pode ocorrer um problema no segundo insert e o primeiro ser executado, e aí gera incosistência de dados, o ideal é fazer como Glauber disse, seta a transação como não autocommit e insere e depois outro, e trata caso deja algum erro, o rollback se propagará para ambos inserts.

Tem razão, cara… Vou rever…

Obrigado!!