2
respostas

Relacionamento entre tabelas: id de uma tabela dentro de outra tabela

Iae pessoal tranquilo, estou tentando fazer um projeto usando o que aprendi no curso e tals, me vejo agora em uma situação onde não tenho ideia de como resolver.

eu tenho uma entidade chamada Questionário e uma outra chamada Perguntas o relacionamento entre as tabelas é o seguinte, um questionário pode ter varias perguntas e uma pergunta pode ter apenas uma questionário.

Até ai acho que fiz tudo certo no que se refere ao relacionamento, pois pelo mysql eu vejo que tem na tabela peguntas uma coluna chamada questionario_id.

No meu form de perguntas o usuário deve escolher qual o questionário essa pergunta pertence, a lista de questionários eu puxei da minha tabela questionário. Até ai tudo bem,

Ai vem a minha duvida, quando tento cadastrar a minha pergunta recebo um exceção NullPointerException

não consigo conceber como eu vou fazer para colocar o id questionário dentro da tabela perguntas?

segue a baixo as minhas classes

package br.com.clienteoculto.models;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.OneToMany;

@Entity
public class Questionario {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String nomeQuestionario;
    @Lob
    private String descricaoQuestionario;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "questionario")
    private List<Pergunta> perguntas = new ArrayList<Pergunta>();

    public List<Pergunta> getPergunta() {
        return perguntas;
    }

    public void setPergunta(List<Pergunta> pergunta) {
        this.perguntas = pergunta;
    }

    public String getNomeQuestionario() {
        return nomeQuestionario;
    }

    public void setNomeQuestionario(String nomeQuestionario) {
        this.nomeQuestionario = nomeQuestionario;
    }

    public String getDescricaoQuestionario() {
        return descricaoQuestionario;
    }

    public void setDescricaoQuestionario(String descricaoQuestionario) {
        this.descricaoQuestionario = descricaoQuestionario;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

}
package br.com.clienteoculto.models;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Pergunta {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column
    private String pergunta;
    @ManyToOne
    private Questionario questionario;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getPergunta() {
        return pergunta;
    }

    public void setPergunta(String pergunta) {
        this.pergunta = pergunta;
    }

    public Questionario getQuestionario() {
        return questionario;
    }

    public void setQuestionario(Questionario questionario) {
        this.questionario = questionario;
    }

}
package br.com.clienteoculto.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;

import br.com.clienteoculto.models.Pergunta;

@Repository
public class PerguntaDAO {

    @PersistenceContext
    private EntityManager manager;

    public void save(Pergunta pergunta) {
        manager.persist(pergunta);
    }

}
package br.com.clienteoculto.controllers;

import javax.transaction.Transactional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import br.com.clienteoculto.daos.PerguntaDAO;
import br.com.clienteoculto.daos.QuestionarioDAO;
import br.com.clienteoculto.models.Pergunta;

@Controller
@RequestMapping("/perguntas")
public class PerguntasController {

    @Autowired
    private QuestionarioDAO questionarioDAO;
    private PerguntaDAO perguntaDAO;

    @RequestMapping("/form")
    public ModelAndView form(){
        ModelAndView modelAndView = new ModelAndView("perguntas/form");
        modelAndView.addObject("quest", questionarioDAO.list());
        return modelAndView;
    }

    @Transactional
    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView save(Pergunta pergunta, RedirectAttributes redirectAttributes){
        ModelAndView modelAndView = new ModelAndView("clientes/ok");
        perguntaDAO.save(pergunta);
        redirectAttributes.addFlashAttribute("Sucesso", "pergunta cadastrada com sucesso");
        return modelAndView;
    }
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<!DOCTYPE html>
<html>
<head>
<meta charset=UTF-8>
<title>Cliente Oculto</title>
</head>
<body>
    <h1>Cadastro de Perguntas</h1>
    <c:url value="/perguntas" var="url" />
    <form action="${url }" method="post">
        <div>
            <c:forEach items="${quest }" var="questionario" varStatus="status">
                <input type="radio" name="questionario.nomeQuestionario"
                    value="${questionario.nomeQuestionario}" />${questionario.nomeQuestionario}
        </c:forEach>

        </div>
        <div>
            <label for="pergunta">Pergunta</label> <input type="text"
                name="pergunta" id="pergunta">
        </div>
        <div>
            <input type="submit" value="Cadastrar">
        </div>
    </form>
</body>
</html>
2 respostas

Em qual linha vc toma nullpointer? Outra coisa, no radiobutton, o value deveria ser o id do questionário e não o nome dele.

na linha 35 mais especificamente quando chamo

perguntaDAO.save(pergunta);

de toda forma segue a exceção completa

GRAVE: Servlet.service() for servlet [dispatcher] in context with path [/clienteoculto] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause
java.lang.NullPointerException
    at br.com.clienteoculto.controllers.PerguntasController.save(PerguntasController.java:35)
    at br.com.clienteoculto.controllers.PerguntasController$$FastClassBySpringCGLIB$$bb2c616f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:266)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)
    at br.com.clienteoculto.controllers.PerguntasController$$EnhancerBySpringCGLIB$$ab776194.save(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

Quanto value realmente não tinha me atentado para isso mesmo assim continuo com a exceção.