[RESOLVIDO] salvar dados em duas tabelas sem utilizar o SELECT MAX para recuperar o ID

5 respostas
F

Boa tarde amigos,

Venho mais uma vez solicitar a força de vocês.

Estou precisando salvar dados em duas tabelas ao mesmo tempo, porém, não posso utilizar o SELECT MAX devido ao risco de ter futuros problemas na aplicação, pois o desenvolvimento é WEB.

Estou trabalhando com DAO.

Seguem as tabelas

CREATE TABLE `edu_endereco` (
  `idedu_endereco` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `end_bairro` VARCHAR(100) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `end_rua` VARCHAR(100) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `end_cep` VARCHAR(10) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `end_numero` VARCHAR(10) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  `end_complemento` VARCHAR(100) COLLATE latin1_swedish_ci DEFAULT NULL,
  PRIMARY KEY (`idedu_endereco`)
)ENGINE=InnoDB
AUTO_INCREMENT=4 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';



CREATE TABLE `edu_instituicao` (
  `idedu_instituicao` INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `edu_endereco_idedu_endereco` INTEGER(10) UNSIGNED NOT NULL,
  `inst_nome` VARCHAR(100) COLLATE latin1_swedish_ci NOT NULL DEFAULT '',
  PRIMARY KEY (`idedu_instituicao`),
  KEY `edu_instituicao_FKIndex1` (`edu_endereco_idedu_endereco`),
  CONSTRAINT `edu_instituicao_ibfk_1` FOREIGN KEY (`edu_endereco_idedu_endereco`) REFERENCES `edu_endereco` (`idedu_endereco`) ON DELETE NO ACTION ON UPDATE NO ACTION
)ENGINE=InnoDB
AUTO_INCREMENT=2 CHARACTER SET 'latin1' COLLATE 'latin1_swedish_ci';

Seguem as classes

Classe Endereço

package br.com.gerais;

/**
 *
 * @author Fabiano
 */
public class Endereco {
    
    private int idEndereco;
    private String bairro;
    private String rua;
    private String cep;
    private String numero;
    private String complemento;
    
    
    public int getIdEndereco() {
        return idEndereco;
    }

    public void setIdEndereco(int idEndereco) {
        this.idEndereco = idEndereco;
    }
    
    public String getBairro() {
        return bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getRua() {
        return rua;
    }

    public void setRua(String rua) {
        this.rua = rua;
    }

    public String getCep() {
        return cep;
    }

    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getComplemento() {
        return complemento;
    }

    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

}

Classe InstituicaoBean

package br.com.instituicao;

import br.com.gerais.Endereco;

public class InstituicaoBean  {
    
    private int idInstituicao;
    private String nomeInstituicao;
    
    private Endereco endereco; 

    public int getIdInstituicao() {
        return idInstituicao;
    }

    public void setIdInstituicao(int idInstituicao) {
        this.idInstituicao = idInstituicao;
    }

    public String getNomeInstituicao() {
        return nomeInstituicao;
    }

    public void setNomeInstituicao(String nomeInstituicao) {
        this.nomeInstituicao = nomeInstituicao;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }
    
}

Classe InstituicaoDao

package br.com.instituicao;

import br.com.conexao.Conexao;

import com.mysql.jdbc.ResultSet;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 *
 * @author Fabiano
 */
public class InstituicaoDao {
   
    public void adiciona (InstituicaoBean instituicao) throws SQLException{
    
    Connection conn = null;
    PreparedStatement stmt = null;
    
        try {
            
           conn = Conexao.getConexao();
    
           /**INSERE DADOS NA TABELA ENDEREÇO**/
           
           String sql_endereco = "INSERT INTO edu_endereco (end_bairro, end_rua, end_cep, end_numero, end_complemento) VALUES (?,?,?,?,?)";
           
           stmt = conn.prepareStatement(sql_endereco);
           
           stmt.setString(1, instituicao.getEndereco().getBairro());
           stmt.setString(2, instituicao.getEndereco().getRua());
           stmt.setString(3, instituicao.getEndereco().getCep());
           stmt.setString(4, instituicao.getEndereco().getNumero());
           stmt.setString(5, instituicao.getEndereco().getComplemento());
           
           stmt.executeUpdate();
                                
            
           /**INSERE DADOS NA TABELA INSTITUICAO**/
                            
            String sql_instituicao = "INSERT INTO edu_instituicao (edu_endereco_idedu_endereco, inst_nome) VALUES (?,?)";
          
            stmt = conn.prepareStatement(sql_instituicao);
                        

            stmt.setString(2, instituicao.getNomeInstituicao());
                                                     
            stmt.executeUpdate();
          
            stmt.close();
            
        } catch (Exception e) {
            
            System.out.println(e);
          
            stmt.close();
        }
    
    finally{
    
        Conexao.fecharConexao(conn, stmt);
        
    }
       
    }
    
}

Classe Teste

package br.com.instituicao;

//import br.com.gerais.Endereco;
import br.com.gerais.Endereco;
import java.sql.SQLException;

/**
 * @author Fabiano
 */
public class Teste {
    
    public static void main (String[] args) throws SQLException
            
    {
     
                             
        /**DADOS ENDERECO**/
        
            Endereco end = new Endereco();
            
            end.setBairro("ITAIPAVA");
            end.setRua("UNIÃO INDÚSTRIA");
            end.setCep("13212180");
            end.setNumero("121");
            end.setComplemento("");
   
            /**DADOS INSTITUICAO**/
            
            InstituicaoBean inst = new InstituicaoBean();   
            

            inst.setNomeInstituicao("JOSÉ BONIFÁCIO"); 
                                    
            inst.setEndereco(end);
                      
            /**INSERIR DADOS NO BANCO**/
            
            InstituicaoDao instDao = new InstituicaoDao();
            
            instDao.adiciona(inst);
              
        
    }

}

[color=red]
Dúvidas

1 - Como recuperar o ID do endereço cadastrado sem utilizar o select max?
2 - Como colocar o id do endereço na setString?
3 - Como setar o (id do endereço ) na classe Teste?

[/color]

Por favor, me ajude pessoal, preciso disto para o meu TCC.

Desde já muito obrigado.

5 Respostas

M

Pelo DDL, você está utilizando o MySQL, correto?

Se sim, o mysql possui uma função que recupera a última primary key inserida na base, a função é LAST_INSERT_ID(). A documentação dessa função está disponivel em http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html.

É apenas uma idéia.

T

Caso seja no oracle e você esteja usando sequence para preencher os IDs (oq é o correto) é só usar o currval de sua sequence, que traz o valor atual que ela está.

obs.: para incrementar 1 no valor atual da sequence o método utilizado é nextval.

A

Não faça isso. Isso acopla seu sistema ao banco de dados e vc perde a flexibilidade. Se seu id é auto incremento utilize a função max mesmo. Não se preocupe tanto com o desempenho. Tenho crtz q aguenta!
Mas o melhor mesmo seria usar o hibernate, q tbm não acopla seu programa a um banco de dados e ao mesmo tempo utiliza de muitas melhorias que cada banco de dados oferece.

H

Assino embaixo!O hibernate afirma que ele reduz em 95% do trabalho realizado para persistência de dados em banco de dados.
Vale a pena estudar. Depois que se conhece, dificilmente não se utiliza o hibernate na camada de persistência de sua aplicação.

J

Cara eu utilizaria o método getGeneratedKeys do PreparedStatement.
Segue um exemplo:

String sql01 = "INSERT INTO Tabela (..., ..., ...) VALUES (?,?,?);";
PreparedStatement ps = conexao.prepareStatement(sql01);
ps.setString(1, valor01);
ps.setString(2, valor02);
ps.setString(3, valor03);
ps.execute();
ResultSet rs = ps.getGeneratedKeys();
int codigo = (rs.next())?rs.getInt(1):0;

Dai você pega a variável codigo e adiciona no sql da segunda tabela.

Criado 10 de março de 2011
Ultima resposta 19 de mar. de 2011
Respostas 5
Participantes 6