Como fazer insert em BD relacional

2 respostas
W

Olá pessoal, estou com uma dúvida.
Fiz um MER e entre outras tabelas existem as tabelas TabCliente, TabEmpreendimento e devido ao relacionamento N:N criei a tabela TabCliente_Empreendimento que receberá codCliente e CodEmpreendimento.
Até aí sem novidades, a dúvida que tenho é na hora de inserir na tabela TabCliente_Empreendimento.

Tenho uma tela em que insiro os dados do cliente na tabela TabCliente e após realizar esse insert fecho a conexão normalmente e faço outro insert dos codCliente e CodEmpreendimento na tabela TabCliente_Empreendimento abrindo outra conexão com o BD.
Funciona, mas não sei se essa é a maneira correta, pois se no segundo insert der um pau por algum motivo, dará problema no relacionamento.
Tem alguma maneira de inserir na TabCliente e atualizar a TabCliente_Empreendimento?
Abaixo seguem os 2 inserts.
Obrigado.

public Cliente incluirCliente(Cliente cliente) throws SQLException, ClienteException {
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;
		boolean result = false;
		try {
			StringBuffer sql = new StringBuffer();
			sql.append("INSERT INTO ");
			sql.append(	"TABCLIENTE ");
			sql.append(		"(NOMECLIENTE,");
            sql.append(		"DTCADASTRO, ");
            sql.append(		"DTNASC, ");
			sql.append(		"SEXO, ");
			sql.append(		"RG, ");
			sql.append(		"CPF, ");
			sql.append(		"ENDERECO, ");
			sql.append(		"COMPLEMENTO, ");
			sql.append(		"BAIRRO, ");
			sql.append(		"CEP, ");
            sql.append(		"CIDADE, ");
            sql.append(		"ESTADO, ");
            sql.append(		"TELEFONERES, ");
            sql.append(		"TELEFONECOM, ");
            sql.append(		"TELEFONECEl, ");
            sql.append(		"EMAIL, ");
            sql.append(		"MSN, ");                        
            sql.append(		"SITUACAO, ");
            sql.append(		"OBS)");
			sql.append("VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
			preparedStatement = prepareStatement(sql.toString());
			preparedStatement.setString(1, cliente.getNomeCli());
            preparedStatement.setDate(2, new java.sql.Date(cliente.getDtCadastro().getTime()));
            preparedStatement.setDate(3, new java.sql.Date(cliente.getDtNasc().getTime()));
            preparedStatement.setInt(4, cliente.getSexo());
            preparedStatement.setString(5, cliente.getRg());
            preparedStatement.setString(6, cliente.getCpf());
            preparedStatement.setString(7, cliente.getEndereco());
            preparedStatement.setString(8, cliente.getCompl());
			preparedStatement.setString(9, cliente.getBairro());
            preparedStatement.setString(10, cliente.getCep());
            preparedStatement.setString(11, cliente.getCidade());
            preparedStatement.setInt(12, cliente.getEstado());
            preparedStatement.setString(13, cliente.getTelRes());
            preparedStatement.setString(14, cliente.getTelCom());
            preparedStatement.setString(15, cliente.getTelCel());
            preparedStatement.setString(16, cliente.getEmail());
			preparedStatement.setString(17, cliente.getMsn());
            preparedStatement.setInt(18, cliente.getSituacao());
            preparedStatement.setString(19, cliente.getObsCli());
			int rows = preparedStatement.executeUpdate();
			if(rows > 0){
				resultSet = preparedStatement.getGeneratedKeys();
				resultSet.setFetchSize(1);
				if ( resultSet.next() ) {
					int code = resultSet.getInt(1);
					cliente.setCodCli(code);
					commit();
				}
				result = true;
			}else{
				rollback();
				throw new SQLException("Erro ao incluir " + cliente);
			}
		}catch (MySQLIntegrityConstraintViolationException msqlie){
		//...	
		}catch(Exception ex){
		//...	
		}
		finally{
			preparedStatement.close();
		}
		return cliente;
	}
public boolean incluirTabEmpreendimento_Cliente(int codCli, int codEmp) throws SQLException, TabEmpreendimento_ClienteException {
		
		PreparedStatement preparedStatement = null;
		boolean result = false;
		try {
			StringBuffer sql = new StringBuffer();
			sql.append("INSERT INTO ");
			sql.append(	"TABEMPREENDIMENTO_CLIENTE");
			sql.append(		"(CODCLIENTE, ");
            sql.append(		"CODEMP) ");            
			sql.append("VALUES(?,?)");
			preparedStatement = prepareStatement(sql.toString());
			preparedStatement.setInt(1, codCli);
            preparedStatement.setInt(2, codEmp);            
			int rows = preparedStatement.executeUpdate();
			if(rows > 0){
				commit();
				result = true;
			}else{
				rollback();
				throw new TabEmpreendimento_ClienteException("Não houve inclusão na tabela TabEmpreendimento_Cliente ");
			}
		}catch(SQLException sqle){
			//...
		}catch (Exception e) {
			//...
		}finally{
			preparedStatement.close();
		}
		return result;
	}

2 Respostas

T

Você precisa incluir ambos os “inserts” em uma única transação do banco de dados. Se um dos “inserts” não der certo (por exemplo, devido a alguma violação de restrição na definição da tabela), então ambos os “inserts” serão ignorados.

W

Oi thingol, eu fiz dessa forma mesmo depois que postei o tópico, só dou commit no banco se as duas transações derem sucesso.
Mas normalmente é dessa forma mesmo que se faz ou teria outra solução?

Criado 18 de janeiro de 2010
Ultima resposta 18 de jan. de 2010
Respostas 2
Participantes 2