Problema com FK

3 respostas
albertoPeppers

Boa noite a todos.
Estou com um problema, tenho cadastro de procedimentos onde gravo o tipo que vem de um tablela tipoProcedimento, nohora de salvar ele da o seguinte

java.lang.RuntimeException: java.sql.SQLException: ORA-02291: restrição de integridade (SINTHOS.FK_PROCEDIMENTO) violada - chave mãe não localizada
Query: INSERT INTO SINTHOS.PROCEDIMENTO(CODIGOPROCEDIMENTO,DESCRICAO,VALOR,CODIGOTIPOPROCEDIMENTO)
VALUES
(4,'procedimento 4',4.4,0) Parameters: []

tenho a classe bean de procedimento
package sinthos.bean;

import java.util.List;

import sinthos.dao.TipoProcedimentoDAO;

public class Procedimento {
	private int codigoProcedimento;
	private String descricao;
	private double valor;
	private List<Procedimento> listaProcedimento;
	//Chave estrangeira TipoProcedimento
	private TipoProcedimento tipoProcedimento;
	private int codigoTipoProcedimento;
	
	public Procedimento(){}

	public int getCodigoProcedimento() {
		return codigoProcedimento;
	}
	public void setCodigoProcedimento(int codigoProcedimento) {
		this.codigoProcedimento = codigoProcedimento;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public double getValor() {
		return valor;
	}
	public void setValor(double valor) {
		this.valor = valor;
	}
	public List<Procedimento> getListaProcedimento() {
		return listaProcedimento;
	}
	public void setListaProcedimento(List<Procedimento> listaProcedimento) {
		this.listaProcedimento = listaProcedimento;
	}
	public TipoProcedimento getTipoProcedimento(){
		return tipoProcedimento;
	}
	public void setTipoProcedimento(TipoProcedimento tipoProcedimento){
		this.tipoProcedimento = tipoProcedimento;
	}
	public int getCodigoTipoProcedimento() {
		return codigoTipoProcedimento;
	}
	public void setCodigoTipoProcedimento(int codigoTipoProcedimento) {
		this.codigoTipoProcedimento = codigoTipoProcedimento;
		TipoProcedimentoDAO daoTipoProcedimento = new TipoProcedimentoDAO();
		this.setTipoProcedimento(daoTipoProcedimento.getTipoProcedimentoPorCodigo(codigoTipoProcedimento));
	}
}
A classe DAO
package sinthos.dao;

import java.util.List;

import org.boxsql.BoxSQL;

import sinthos.bean.Procedimento;

public class ProcedimentoDAO {
	
	public ProcedimentoDAO(){}
	
	//Método responsável por salvar 
	public Procedimento salvarProcedimento(Procedimento procedimento){
		Procedimento procedimentoSalvo = null;
		BoxSQL box = new BoxSQL();
		box.setParameter("CODIGOPROCEDIMENTO", procedimento.getCodigoProcedimento());
		try{
			procedimentoSalvo = (Procedimento) box.getObject("procedimentoPorCodigo.sql", Procedimento.class);
			if(procedimentoSalvo == null){
				box.executeUpdate("cadastrarProcedimento.sql", procedimento);
			}else{
				box.executeUpdate("alterarProcedimento.sql", procedimento);
			}
			procedimentoSalvo = (Procedimento) box.getObject("procedimentoGetPorCodigo.sql", Procedimento.class);
		}finally{
			box.release();
		}
		return procedimentoSalvo;
	}
	//Método responsável por excluir 
	public void excluirProcedimento(int codigoProcedimento){
		BoxSQL box = new BoxSQL();
		box.setParameter("CODIGOPROCEDIMENTO", codigoProcedimento);
		try{
			box.executeUpdate("excluirProcedimento.sql");
		}finally{
			box.release();
		}
	}
	//Método responsável por procurar pelo código 
	public Procedimento getProcedimentoPorCodigo(int codigoProcedimento){
		Procedimento procedimento = null;
		BoxSQL box = new BoxSQL();
		box.setParameter("CODIGOPROCEDIMENTO", codigoProcedimento);
		try{
			procedimento = (Procedimento) box.getObject("procedimentoPorCodigo.sql", Procedimento.class);
		}finally{
			box.release();
		}
		return procedimento;
	}
	//Método responsável por procurar pela descrição
	public Procedimento getProcedimentoPorDescricao(String descricao){
		Procedimento procedimento = null;
		BoxSQL box = new BoxSQL();
		box.setParameter("DESCRICAO", descricao);
		try{
			procedimento = (Procedimento) box.getObject("procedimentoPorDescricao.sql", Procedimento.class);
		}finally{
			box.release();
		}
		return procedimento;
	}
	//Método responsável por retornar o proximo código da tabela 
	public int getProximoCodigoProcedimento(){
		int proximoCodigoProcedimento = 0;
		Procedimento procedimento = new Procedimento();
		BoxSQL box = new BoxSQL();
		try{
			procedimento = (Procedimento) box.getObject("procedimentoMaxCodigo.sql", Procedimento.class);
			proximoCodigoProcedimento = procedimento.getCodigoProcedimento()+1;
		}finally{
			box.release();
		}
		return proximoCodigoProcedimento;
	}
	//Método responsável por criar uma lista 
	public List<Procedimento> getTodosProcedimentos(){
		BoxSQL box = new BoxSQL();
		List<Procedimento> listaProcedimento;
		try{
			listaProcedimento = box.getList("procedimentoTodos.sql", Procedimento.class);
		}finally{
			box.release();
		}
		return listaProcedimento;
	}
}
A pagina JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
		<link rel='stylesheet' type='text/css' href='modelos/estilo.css'/>
		<title>Procedimento</title>
	</head>
	<body>
		<div class="principal">
			<div class="cabecalho"></div>
			<c:if test="${procedimento==null}">
				<script language="javascript">window.location='procedimento.do'</script>
			</c:if>
			<div class="aba">
				<a href="atendimento.htm"><img src="imagens/aba_cadastro1.png" border="0"></a><img src="imagens/aba_cadastro2.png"><a href="relatorios.htm"><img src="imagens/aba_cadastro3.png" border="0"></a>
			</div>
			<div class="conteudo">
				<center>
					<form name="cadProcedimento" id="cadProcedimento" method="post" action="procedimento.do">
						<table>
							<tr>
								<td>Código: </td>
								<td><input type="text" name="codigo" id="codigo" maxlength="6" value="${procedimento.codigoProcedimento }" size="4"/></td>
							</tr>
							<tr>
								<td>Descrição: </td>
								<td><input type="text" name="descricao" id="descricao" maxlength="50" value="${procedimento.descricao }"/></td>
							</tr>
							<tr>
								<td>Valor: </td>
								<td><input type="text" name="valor" id="valor" value="${procedimento.valor }"></td>
							</tr>
							<tr>
								<td>Tipo: </td>
								<td>
									<select name="tipoProcedimento" id="tipoProcedimento">
										<c:forEach items="${listaTipoProcedimento }" var="tipoProcedimento">
											<option value="${tipoProcedimento.codigoTipoProcedimento }">${tipoProcedimento.descricao }</option>
										</c:forEach>
										<c:if test="${procedimento != null }">
											<option value="${procedimento.tipoProcedimento.codigoTipoProcedimento }"/>${procedimento.tipoProcedimento.descricao }</option>
										</c:if>
									</select>
								</td>
							</tr>
						</table>
						<br/>
						<img src="imagens/anterior.png"> <input type="text" name="navegar" id="navegar" size="4"/> <img src="imagens/proximo.png"/>
						<br/>
						<table>
							<tr>
								<td>
									<input type="image" src=imagens/btn_salvar.png name="acao" value="salvar"/>
                	 				<input type="image" src=imagens/btn_excluir.png name="acao" value="excluir"/> 
								</td>
								<td>
									<input type="image" src=imagens/btn_pesquisar.png name="acao" value="pesquisar"/> 	  	
            	    	 			<input type="image" src=imagens/btn_limpar.png name="acao" value="limpar"/>  
								</td>
							</tr>
						</table>
					</form>
				</center>
			</div>
			<br/><br/><br/><br/><br/>
			<a href="cadastros.htm"><img src="imagens/voltar.png" border="0"/></a> <img align="right" src="imagens/procedimento.png"/> 
			<div class="rodape">Copyright by SINTHOS</div>
		</div>	
	</body>
</html>
E o servlet
package sinthos.ctr;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sinthos.bean.Procedimento;
import sinthos.bean.TipoProcedimento;
import sinthos.dao.ProcedimentoDAO;
import sinthos.dao.TipoProcedimentoDAO;
import sun.reflect.ReflectionFactory.GetReflectionFactoryAction;

 public class ProcedimentoCTR extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;

	public ProcedimentoCTR() {
		super();
	}   	

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Define o tipo de resposta
		response.setContentType("text/html; charset=iso-8859-1");
		Procedimento procedimento = new Procedimento();
		ProcedimentoDAO daoProcedimento = new ProcedimentoDAO();
		//Envia o proximo código a ser cadastrado para tela
		procedimento.setCodigoProcedimento(daoProcedimento.getProximoCodigoProcedimento());
		request.setAttribute("procedimento", procedimento);
		//Cria lista de tipos de procedimento
		TipoProcedimentoDAO daoTipoProcedimento = new TipoProcedimentoDAO();
		List<TipoProcedimento> listaTipoProcedimento = daoTipoProcedimento.getTodosTipoProcedimento();
		request.setAttribute("listaTipoProcedimento", listaTipoProcedimento);
		//Redireciona para tela
		request.getRequestDispatcher("procedimento.jsp").forward(request, response);
	}  	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Define o tipo de resposta
		response.setContentType("text/html; charset=iso-8859-1");
		Procedimento procedimento = new Procedimento();
		ProcedimentoDAO daoProcedimento = new ProcedimentoDAO();
		String acao = request.getParameter("acao");
		//Recupera dados da tela
		procedimento.setCodigoProcedimento(Integer.parseInt(request.getParameter("codigo")));
		procedimento.setDescricao(request.getParameter("descricao"));
		procedimento.setValor(Double.parseDouble(request.getParameter("valor")));
		//Cria o objeto TipoProcedimentoDAO para recuperar o tipo de procedimento do procedimento
		TipoProcedimentoDAO daoTipoProcedimento = new TipoProcedimentoDAO();
		//Atribui o tipo de procedimento recuperado para o procedimento que está sendo cadastrado
		procedimento.setTipoProcedimento(daoTipoProcedimento.getTipoProcedimentoPorCodigo(Integer.parseInt(request.getParameter("tipoProcedimento"))));
		//Condição dos botões
		if(acao.equals("salvar")){
			procedimento = daoProcedimento.salvarProcedimento(procedimento);
			request.getRequestDispatcher("procedimento.jsp").forward(request, response);
		}else if(acao.equals("excluir")){
			daoProcedimento.excluirProcedimento(Integer.parseInt(request.getParameter("codigo")));
			request.getRequestDispatcher("procedimento.jsp").forward(request, response);
		}else if(acao.equals("pesquisar")){
			procedimento = daoProcedimento.getProcedimentoPorDescricao(procedimento.getDescricao());
			request.setAttribute("procedimento", procedimento);
			request.getRequestDispatcher("procedimento.jsp").forward(request, response);
		}else{
			request.getRequestDispatcher("procedimento.jsp").forward(request, response);
		}
	}   	  	    
}

Alguem pode me dar uma dica do que está acontecendo????

3 Respostas

luciano2

Nem precisava postar o código, seu erro é no banco.

A tabela onde você quer inserir possui a chave estrangeira de outra tabela. Logo para você inserir esse valor na tabela filha ele tem q existir na tabela mãe.

albertoPeppers

Cara, fiz um insert no braço e deu certo, acho que não estou recuperando certo no Servlet.

albertoPeppers

Consegui…estava errado no servlet mesmo

Troquei o código

//Cria o objeto TipoProcedimentoDAO para recuperar o tipo de procedimento do procedimento TipoProcedimentoDAO daoTipoProcedimento = new TipoProcedimentoDAO(); //Atribui o tipo de procedimento recuperado para o procedimento que está sendo cadastrado procedimento.setTipoProcedimento(daoTipoProcedimento.getTipoProcedimentoPorCodigo(Integer.parseInt(request.getParameter("tipoProcedimento"))));

Por

//Recupera o Tipo de Procedimento da tela procedimento.setCodigoTipoProcedimento(Integer.parseInt(request.getParameter("tipoProcedimento")));

e deu certo.
Obrigado pela dica

Criado 11 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 3
Participantes 2