0
respostas

Help! org.hibernate.TransientPropertyValueException: object references an unsaved transient instance

Pessoal, tudo bom?

Estou tentando criar um metodo Post (Cadastrar) que recebe uma requisição e persiste uma classe tópico no banco de dados, porém não estou conseguindo evoluir por conta do erro abaixo.

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : br.com.alura.forum.modelo.Topico.autor -> br.com.alura.forum.modelo.Usuario

Segue código fonte: https://gitlab.com/weslfra/curso-kotlin/-/tree/feature-boo-erro

package br.com.alura.forum.controller

import br.com.alura.forum.controller.dto.TopicoDto
import br.com.alura.forum.controller.form.TopicoRequest
import br.com.alura.forum.modelo.Curso
import br.com.alura.forum.modelo.Topico
import br.com.alura.forum.repository.CursoRepository
import br.com.alura.forum.repository.TopicoRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.web.util.UriComponentsBuilder
import java.net.URI

@RestController
@RequestMapping("/topicos")
class TopicosController {

    @Autowired
    lateinit var topicoRepository: TopicoRepository

    @Autowired
    lateinit var cursoRepository: CursoRepository

    @GetMapping("/topicoMemoria")
    fun listaMemoria(): List<TopicoDto> {

        val topico = Topico(
                titulo = "Alura ",
                mensagem = "Meu primeiro Curso",
                curso = Curso(
                        nome = "spring boot 1",
                        categoria = "Programcao"
                )
        )
        return TopicoDto.converter(listOf(topico, topico, topico))
    }

    @GetMapping
    fun lista(nomeCurso: String?): List<TopicoDto> {
        if (nomeCurso == null) {
            val topicos: List<Topico> = topicoRepository.findAll()
            return TopicoDto.converter(topicos)
        } else {
            val topicos: List<Topico> = topicoRepository.findByCursoNome(nomeCurso)
            return TopicoDto.converter(topicos)
        }
    }

    @PostMapping
    fun cadastrar(
            @RequestBody request: TopicoRequest,
            uriBuilder: UriComponentsBuilder
    ): ResponseEntity<TopicoDto> {

        val topico: Topico = request.converter(cursoRepository)
        topicoRepository.save(topico)

        var uri: URI = uriBuilder.path("/topicos/{id}").buildAndExpand(topico.id).toUri()
        return ResponseEntity.created(uri).body(TopicoDto(topico))
    }
}