Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exception > object references an unsaved transient instance

Pessoal, eu estou com outro problema agora, caso puder me ajudar ficarei muito grato...

Estou com esta exception: object references an unsaved transient instance - save the transient instance before flushing : com.atletasCPB.model.AtletaDocumento.atleta -> com.atletasCPB.model.Atleta

Segue minhas classes:

METODO DA CONTROLLER:

@RequestMapping("cadastrarAtleta")
    public String salva(Atleta atleta, AtletaDocumento atletaDocumento) {
        try {
            atletaDocumento.setAtleta(atleta);
            adr.save(atletaDocumento);
            atletaRepository.save(atleta);
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
            ex.printStackTrace();
        }

        return "redirect:formAtleta";
    }

MODELS:

@Entity
public class Atleta {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nome;
    private String dataNascimento;
    private String tipoDeficiencia;
    private String modalidade;

    @OneToMany(mappedBy="atleta")
    private List<AtletaDocumento> atletaDocumento;
@Entity
public class AtletaDocumento {

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

    @ManyToOne
    private Atleta atleta;
    private String tipoDocumento;
    private String numeroDocumento;

FORMULARIO DE CADASTRO:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<c:import url="/WEB-INF/jsp/_comum/header.jsp" />
    <h2>Cadastro de Atletas</h2>
                <form method="post" action="cadastrarAtleta">
                    <div class="form-group">
                        <label for="nome">Nome:</label>
                        <input type="text" class="form-control" name="nome">
                      </div>
<!--                       <div class="form-group"> -->
<!--                         <label for="cpf">CPF:</label> -->
<!--                         <input type="text" class="form-control" name="cpf"> -->
<!--                       </div> -->
<!--                       <div class="form-group"> -->
<!--                         <label for="rg">RG:</label> -->
<!--                         <input type="text" class="form-control" name="rg"> -->
<!--                       </div> -->

                    <div>
                        <label for="tipoDocumento">Tipo de documento:</label>
                        <input type="text" class="form-control" name="tipoDocumento" >
                    </div>
                    <div>
                        <label for="numeroDocumento">Numero do documento:</label>
                        <input type="text" class="form-control" name="numeroDocumento" >
                    </div>
                    <div class="form-group">
                        <label for="dataNascimento">Data Nascimento:</label>
                        <input type="date" class="form-control" name="dataNascimento">
                      </div>
                          <div class="form-group">
                        <label for="tipoDeficiencia">Tipo Deficiencia:</label>
                        <input type="text" class="form-control" name="tipoDeficiencia">
                      </div>
                      <div class="form-group">
                        <label for="modalidade">Modalidade:</label>
                        <input type="text" class="form-control" name="modalidade">
                      </div>

                    <button type="submit" class="btn btn-default">Adicionar</button>
                </form>        

<c:import url="/WEB-INF/jsp/_comum/footer.jsp" />
4 respostas

Oi Bruno, acredito que a exceção ocorre porque você está salvando o atletaDocumento antes de salvar o atleta. Tente chamar atletaRepository.save(atleta) antes de setar o atleta do atletaDocumento - senão o hibernate não consegue fazer a relação entre as entidades.

Aguardo seu feedback

Olá Thais, deu certo sim, muito obrigado !!!

Mas poderia me ajudar em mais um aspecto, antes quando eu tinha somente uma entidade eu conseguir listar os objetos normalmente, porem agora como tenho dois objetos, como ficaria a jsp e a controller ?

Caso tenha alguma blog ou curso pra indicar eu posso fazer esta pesquisa...

Vou postar a jsp e o metodo de listagem:

JSP:

<c:import url="/WEB-INF/jsp/_comum/header.jsp" />

    <main>
    <h2>Lista de Atletas</h2>
        <table class="table table-bordered">
            <tr>
                <td>Nome</td>
                <td>Data Nascimento</td>
                <td>Tipo Deficiencia</td>
                <td>Modalidade</td>
                <td>Deletar</td>
                <td>Alterar</td>
            </tr>

            <c:forEach items="${atleta}" var="atleta">
                <tr>
                    <td>${atleta.nome}</td>
                    <td>${atleta.dataNascimento}</td>
                    <td>${atleta.tipoDeficiencia}</td>
                    <td>${atleta.modalidade}</td>
<%--                     <c:forEach items="${atletaDocumento}" var="atletasDocumentos"> --%>
<%--                         <td>${atletaDocumento.tipoDocumento}</td> --%>
<%--                         <td>${atletaDocumento.numeroDocumento}</td> --%>
<%--                     </c:forEach> --%>
                    <td><a href="excluirAtleta?id=${atleta.id}">Remover</a></td>
                    <td><a    href="mostrarAtleta?id=${atleta.id}">Alterar</a></td>
                </tr>
            </c:forEach>
        </table>
    </main>

<c:import url="/WEB-INF/jsp/_comum/footer.jsp" />

Controller:

    @RequestMapping("listarAtletas")
    public ModelAndView listaAtletas() {
        ModelAndView mv = new ModelAndView("listaAtletas");
        Iterable<Atleta> atletas = atletaRepository.findAll();
        mv.addObject("atleta", atletas);
        return mv;
    }

O hibernate esta fazendo o select, porem na jsp nao aparece nada...

solução!

Olá Bruno, seu .jsp está correto, só faltou pegar a lista de documentos corretamente, no atributo items da tag <c:forEach> faça:

<c:forEach items="${atleta.atletaDocumento}" var="atletasDocumentos">

${atleta.atletaDocumento} vai chamar o método getAtletaDocumento() da objeto atleta que retorna uma lista.

E chame cada atributo de acordo com o nome do atributo var que você deu (atletasDocumentos):

<c:forEach items="${atleta.atletaDocumento}" var="atletasDocumentos>
    <td>${atletasDocumentos.tipoDocumento}</td
    <td>${atletasDocumentos.numeroDocumento}</td>
</c:forEach>

veja se funciona. aguardo seu feedback!

Deu certo sim Thais, muito obrigado mesmo viu !!! Até a proxima

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software