Ajuda em relacionamento N para N

4 respostas
albertoPeppers

Boa noite a todos. Estou com a seguinte dificuldade no desenvolvimento de um sistema

Tenho Uma Classe Médico e uma Especialidade, do relacionamento das duas surge um terceira tabela MedicoEspecialidade contendo o cpf do medico e o codigo da especialidade, onde um medico pode ter varias especialidades.

Toda vez que eu cadastrar um médico no sistema preciso recuperar as especialidades que ele possui e gravar seu cpf e o codigo da especialidade na tabela MedicoEspecialidade. Meus codigos.

medico.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!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">
		<script type="text/javascript" src="modelos/validacaoHeranca.js"></script>
		<script type="text/javascript" src="modelos/ajax.js"></script>
		<title>SINTHOS - Sistema de Internações Hospitalares</title>
	</head>
	<body>
		<div class="principal">
			<div class="cabecalho"></div>
			<div class="aba">
				<a href="atendimento.jsp"><img src="imagens/aba_cadastro1.png" border="0"></a><img src="imagens/aba_cadastro2.png"><a href="relatorios.jsp"><img src="imagens/aba_cadastro3.png" border="0"></a>
			</div>
			<div class="conteudo">
				<center>
					<form name="formMedico" id="formMedico" method="post" action="medico.do">
						<table>
							<tr>
								<td><font color="red">* </font>CPF: </td>
								<td><input type="text" name="cpf" id="cpf" class="dados" maxlength="14" onkeypress="return campoNumerico(event)" onkeyup="mascaraCpf(this,event)" onblur="buscarMedico(this.value)"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>CRM: </td>
								<td><input type="text" name="crm" id="crm" class="dados" maxlength="5" onkeypress="return campoNumerico(event)"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>RG: </td>
								<td><input type="text" name="rg" id="rg" class="dados" maxlength="15" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>Nome: </td>
								<td><input type="text" name="nome" id="nome" class="texto" onkeydown="tamanhoMaximo(this,50)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>Endereço: </td>
								<td><input type="text" name="endereco" id="endereco" class="texto" onkeydown="tamanhoMaximo(this,50)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>Número: </td>
								<td><input type="text" name="numero" id="numero" class="texto" onkeydown="tamanhoMaximo(this,10)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td>Bairro: </td>
								<td><input type="text" name="bairro" id="bairro" class="texto" onkeydown="tamanhoMaximo(this,50)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>Cidade: </td>
								<td><input type="text" name="cidade" id="cidade" class="texto" onkeydown="tamanhoMaximo(this,50)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td>CEP: </td>
								<td><input type="text" name="cep" id="cep" class="dados" maxlength="9" onkeypress="return campoNumerico(event)" onkeyup="mascaraCep(this,event)"/></td>
							</tr>
							<tr>
								<td><font color="red">* </font>Estado: </td>
								<td><input type="text" name="estado" id="estado" class="texto" onkeydown="tamanhoMaximo(this,50)" onchange="this.value=this.value.toUpperCase();"/></td>
							</tr>
							<tr>
								<td>Telefone: </td>
								<td><input type="text" name="telefone" id="telefone" class="dados" maxlength="13" onkeypress="return campoNumerico(event)" onkeyup="mascaraTelefone(this)"/></td>
							</tr>
								<table>
									<tr>
										<td><input type="checkbox" name="especialidade" id="especialidade" value="1"/>ALERGOLOGIA</td>
										<td><input type="checkbox" name="especialidade" id="especialidade" value="2"/>ANATOMIA PATOLOGICA</td>
										<td><input type="checkbox" name="especialidade" id="especialidade" value="3"/>ANESTESIOLOGIA</td>
										<td><input type="checkbox" name="especialidade" id="especialidade" value="4"/>ANGIOLOGIA </td>
									</tr>
								</table>
							<tr>
								<td></td>
								<td><font color="red">*</font> Campos Obrigatórios.</td>
							</tr>
						</table>
						<br/>
						<!--<img src="imagens/botaoAnterior.png"> <input type="text" name="navegar" id="navegar" size="4" disabled="disabled"/> <img src="imagens/botaoProximo.png"/>!-->
						<br/>
						<table>
							<tr>
								<td>
									<input type="button" class="botao" name="acao" value="Salvar" onclick="salvarDados('formMedico','medico')"/>
									<input type="submit" class="botao" name="acao" value="Excluir"/>	
									<input type="reset" class="botao" name="acao" value="Limpar"/>
								</td>
							</tr>
						</table>
					</form>
				</center>
			</div>
			<br/><br/><br/><br/><br/>
			<a href="cadastros.jsp"><img src="imagens/botaoVoltar.png" border="0"/></a> <img align="right" src="imagens/medico.png"/> 
			<div class="rodape">Copyrigth by SINTHOS.</div>
		</div>
	</body>
</html>

Classe MedicoCTR(Servlet)

package sinthos.ctr;

import java.io.IOException;
import java.io.PrintWriter;

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

import sinthos.bean.Medico;
import sinthos.bean.MedicoEspecialidade;
import sinthos.dao.MedicoDAO;
import sinthos.dao.MedicoEspecialidadeDAO;

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

	public MedicoCTR() {
		super();
	}   	

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter saida = response.getWriter();
		String cpf = request.getParameter("cpf");
		saida.print(geraXML(cpf));
		saida.close();
	}  	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//Defini o tipo de resposta
		response.setContentType("text/xml");
		response.setCharacterEncoding("ISO-8859-1");
		//Cria os objetos e variaveis
		MedicoEspecialidade medicoEspecialidade = new MedicoEspecialidade();
		MedicoEspecialidadeDAO daoMedicoEspecialidade = new MedicoEspecialidadeDAO();
		Medico medico = new Medico();
		MedicoDAO daoMedico = new MedicoDAO();
		PrintWriter saida = response.getWriter();
		String acao = request.getParameter("acao");
		//Recupera da tela
		medico.setCpf(request.getParameter("cpf"));
		medico.setCrm(Integer.parseInt(request.getParameter("crm")));
		medico.setRg(request.getParameter("rg"));
		medico.setNome(request.getParameter("nome"));
		medico.setEndereco(request.getParameter("endereco"));
		medico.setNumero(request.getParameter("numero"));
		medico.setBairro(request.getParameter("bairro"));
		medico.setCidade(request.getParameter("cidade"));
		medico.setCep(request.getParameter("cep"));
		medico.setEstado(request.getParameter("estado"));
		medico.setTelefone(request.getParameter("telefone"));
		//Ação dos botões
		if(acao.equals("Excluir")){
			daoMedicoEspecialidade.excluirMedicoEspecialidade(medico.getCpf());
			daoMedico.excluirMedico(medico.getCpf());
			request.getRequestDispatcher("mensagemOk.jsp").forward(request, response);
		}else{
			medico = daoMedico.salvarMedico(medico);
			//Cria uma lista e recupera as especialidades selecionadas
			String[] especialidades = request.getParameterValues("especialidade");
			for(String especialidade : especialidades){
				String especialidadeTexto = especialidade;
				int especialidadeValor = Integer.parseInt(especialidadeTexto);
				medicoEspecialidade.setCodigoEspecialidade(especialidadeValor);
				medicoEspecialidade.setCpf(request.getParameter("cpf"));
				medicoEspecialidade = daoMedicoEspecialidade.salvarMedicoEspecialidade(medicoEspecialidade);
			}
			if(medico == null){
				saida.print("<msg>Problemas ao salvar o medico no sistema.</msg>");
			}else{
				saida.print("<msg>Medico salvo com sucesso.</msg>");
			}
			saida.close();
		}
	}
	
	private StringBuffer geraXML(String cpf){
		MedicoDAO daoMedico = new MedicoDAO();
		Medico medico = daoMedico.getMedicoPorCpf(cpf);
		StringBuffer xml = new StringBuffer();
		if(medico != null){
			xml.append("<medico>");
			xml.append("<cpf>"+medico.getCpf()+"</cpf>");
			xml.append("<crm>"+medico.getCrm()+"</crm>");
			xml.append("<rg>"+medico.getRg()+"</rg>");
			xml.append("<nome>"+medico.getNome()+"</nome>");
			xml.append("<endereco>"+medico.getEndereco()+"</endereco>");
			xml.append("<numero>"+medico.getNumero()+"</numero>");
			xml.append("<bairro>"+medico.getBairro()+"</bairro>");
			xml.append("<cidade>"+medico.getCidade()+"</cidade>");
			xml.append("<cep>"+medico.getCep()+"</cep>");
			xml.append("<estado>"+medico.getEstado()+"</estado>");
			xml.append("<telefone>"+medico.getTelefone()+"</telefone>");
			xml.append("</medico>");
		}
		return xml;
	}
}

Da linha 60 até a 67 estou tentando criar um array com os valores dos checkbox, crio um for que pra cada valor passo para inteiro e tento guardar a especialidade e o cpf na tabela MedicoEspecialidade mas encontro o seguinte erro:

java.lang.NullPointerException
	sinthos.ctr.MedicoCTR.doPost(MedicoCTR.java:64)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

O médico salva normalmente apenas a tabela MedicoEspecialidade não salva. Alguem sabe me dizer o que estou fazendo de errado.

Desde ja, muito obrigado a todos.

4 Respostas

renanreismartins

bom dia amigo, está salvando pq até o momento que vc salva o medico nao acontece nenhum erro, entao o medico é gravado, após isso acontece essa exception e então o programa não alcança a linha que salva as especialidades, voce pode mudar isso colocando em uma transação.

vamos ao codigo:

vc nao precisa da linha abaixo, vc está duplicando variavel.

String especialidadeTexto = especialidade;

quanto ao NullPointerException não consegui encontrar o motivo uma vez que sua variavel medicoEspecialidade já foi inicializada. Tente fazer um debug e ver oq tem nas variaveis medicoEspecialidade e especialidadeValor para prosseguirmos

abrassssssssss

albertoPeppers

Renan, tirei a linha que vc disse que está duplicada.

Coloquei o breakpoint para saber quais os valores, mas na hora de debugar não estou conseguindo encontra-los.

renanreismartins

como assim nao esta conseguindo encontra-los ?

da null ?

abrassss

albertoPeppers

Opa…dei uma olhada aqui e tá retornando null mesmo.

Criado 28 de outubro de 2010
Ultima resposta 3 de nov. de 2010
Respostas 4
Participantes 2