14
respostas

Problema com relacionamento entre entidades

Tenho uma entidade agenda que busca valores de diversas outras tabelas. Segue o código da entidade agenda. Criei um formulário e no controller agenda fiz com que buscasse lista de todos os atributos de outra tabela, porém quando eu criei um método para gravar, ele não grava. Apresenta um erro 400 como se não encontrasse, porém está com o request correto. Não consigo entender o por que desse erro. Não sei se falta alguma configuração

@Entity
public class Agenda {

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String paciente;
    private int cartSUS;
    private String enderecoPaciente;
    private String cidadePaciente;
    @Enumerated(EnumType.STRING)
    private UF UF;    
    @OneToOne
    private Procedimento procedimento;    
    @OneToOne
    private PostoSaude postoSaude;
    @OneToOne
    private Medico medicos;
    @DateTimeFormat
    private Calendar dataAtendimento;
public class AgendaController {

    @Autowired
    private AgendaDAO agendaDAO;
    @Autowired
    private ProcedimentoDAO procedimentoDAO;
    @Autowired
    private MedicoDAO medicoDAO;
    @Autowired PostoSaudeDAO postosaudeDAO;

    @RequestMapping("/formAgenda")
    public ModelAndView form(){

        List<Procedimento> procedimentos = procedimentoDAO.listar();
        List<Medico> medicos = medicoDAO.listar();
        List<PostoSaude> postos = postosaudeDAO.listar();

        ModelAndView mv = new ModelAndView("formAgenda");
        mv.addObject("procedimentos", procedimentos);
        mv.addObject("medicos",medicos);
        mv.addObject("postos", postos);
        mv.addObject("UF", UF.values());
        System.out.println(procedimentos.size());
        return mv;
    }

    @RequestMapping("/cadagenda")
    public String gravar(Agenda agenda){
        agendaDAO.gravar(agenda);
        return "ok";
    }
14 respostas

Sem nenhuma mensagem de erro não da para saber... Tem como adicionar alguma informação aqui? Como está o seu form também?

Olá Felipe, tudo bem?

Desculpe me intrometer na discussão, vi seu código e fiquei com uma dúvida. Na parte:

@RequestMapping("/cadagenda")
    public String gravar(Agenda agenda){
        agendaDAO.gravar(agenda);
        return "ok";
    }

Você configurou o "ok" como sendo uma jsp ou você gostaria que a mensagem "ok" aparecesse na sua jsp? Se foi o primeiro caso, tenta verificar se sua página ok está no local correto (dentro de WEB-INF/#alguma pasta junto com as outras jsp#). Caso seja a segunda opção, tente fazer, por exemplo:

@RequestMapping("/cadagenda")
    public String gravar(Agenda agenda, Model model){
        agendaDAO.gravar(agenda);
    model.addAttribute("mensagem", "Agenda adicionado com sucesso");
        return "#página jsp#";
    }

Para pegar a mensagem na sua jsp, coloque por exemplo:

<span>${mensagem}</span>

Espero ter ajudado de alguma forma!

Abs

Rafael, o OK é o nome da página, que retorna apenas uma mensagem de inserção com sucesso que está na jsp ok.

Alberto, o erro é 404 de não encontrar a página, porém está no local certo, o problema pelo que entendi é com as informações que busco do banco para apresentar no form. Se eu tirar esses List que constam na minha form. As informações restantes da agenda são inseridas. Por isso que acredito que seja alguma configuração que não fiz no relacionamento entre as entidades. No meu form os valores são buscados corretamente através do select, porém na hora de gravar, da esse erro. Conseguiu me entender?

Opa, acho que consegui sim. É que 404, em geral, não tem nada a ver com problema de envio de parâmetros... Alguma url não deve estar correta mesmo.. Só estou falando isso pq, geralmente, a solução mais simples é a correta mesmo :P.

Alberto, também achei estranho retornar o 404, porém como te falei, sei que não é url por que se eu tirar do meu form as tags select que buscam do banco, o erro não apresenta e é inserido dentro do banco.. ou seja, o problema está no relacionamento entre as tags select do form e o os atributos da classe agenda quando acionado o método gravar.

Bom, então olhando assim eu não sei o que é... Se não dá nenhuma exception nem nada, não dá para saber o que é sem ver mais partes do código.

Oi Felipe,

Seu método gravar no dao está anotado com @Transactional? Caso não esteja, tente colocá-la e fazer um novo teste (obs: o Transactional seria do org.springframework.transaction.annotation.Transactional)

a minha classe AgendaDAO está anotada.. o método não, porém o método pertence a essa classe...seria isso?

Olá,

Antes de gravar um agendamento no seu AgendaDAO, você tem que adicionar um objeto Médico, um objeto Procedimento e um objeto PostodeSaude ao seu agendamento para então conseguir gravá-lo com sucesso.

Depure o método gravar, para confirmar se realmente está fazendo o que deveria.

Desculpe Vinicius, não entendi como seria, você diz na minha classe agenda? já criei os atributos de cada tipo.

O jsp do form.

Cadastro da Agenda

Paciente
Masculino
Femenino
Cartão SUS
Endereço
Cidade
Estado ${UF}
Procedimento ${procedimento.descricao}
Posto de Saúde ${postoSaude.nomePsf}
Medico ${medico.nomeMedico}
Date de Atendimento

Estado select name="UF"
${UF}
Procedimento select name="procedimento" class="form-control"
${procedimento.descricao}
Posto de Saúde select name="postoSaude" class="form-control"
${postoSaude.nomePsf}
Medico ${medico.nomeMedico}
Date de Atendimento

'''

alguma ajuda?