3
respostas

Estou recebendo erro no teste de recuperar o Plano pelo id.

Unable to find br.com.alura.alugames.data.plano.PlanoEntity with id 28, este erro aparece. Acredito que eu tenha criado algumas vezes os planos e os ID foram subindo. Porém já dei um DELETE FROM PLANOS e recriei com os ids iniciais, estou usando o Oracle Database. Alguma ideia de como resolver?

3 respostas

Olá Gabriel, caso ainda não tenha resolvido, poderia passar o código equivalente dos seguintes arquivos para podermos analisar melhor?

  • testePlanoBanco.kt -> Para saber como estão sendo inseridos os planos;
  • testeGamerBanco.kt - > Para saber como está sendo inserido o gamer;
  • PlanoExtension.kt -> Para ver como que está sendo montado o objeto para o DAO.

Recomendo executar em modo debug e por breakpoints nessas linhas:

gamer.plano = planosDAO.recuperarPeloId(3) gamerDAO.adicionar(gamer)

para ver como eles se comportam.

Pode analisar também fazendo SELECT no gamers e no planos no banco de dados para ver se os dados estão lá. Mas acredito que esta análise já foi feita.

Uma última solução, mas só se as análises anteriores não deram certo, talvez seja necessário executar o exercício novamente com o banco de dados limpo para ver se o problema é realmente no banco ou no código.

Como você mencionou que os IDs foram subindo, um DROP SEQUENCE da sequence da tabela de planos e depois deletar os registros já seria o suficiente.

Para uma limpeza completa: DROP CONSTRAINT para deletar a relação, DROP SEQUENCE para deletar o que está incrementando os ids e DROP TABLE para limpar tudo de vez.

package br.com.alura.alugames.principal

import br.com.alura.alugames.data.Database
import br.com.alura.alugames.data.plano.PlanoDAO
import br.com.alura.alugames.modelo.PlanoAssinatura
import br.com.alura.alugames.modelo.PlanoAvulso

fun main() {
    val avulso = PlanoAvulso("BRONZE")
    val prata = PlanoAssinatura("PRATA", 9.90, 3, 0.15)
    val ouro = PlanoAssinatura("OURO", 19.90, 5, 0.20)
    val platina = PlanoAssinatura("PLATINA", 29.90, 10, 0.30)
    val diamante = PlanoAssinatura("DIAMANTE", 49.90, 20, 0.50)

    val manager = Database.getEntityManager()
    val planosDAO = PlanoDAO(manager)

    planosDAO.add(avulso)
    planosDAO.add(prata)
    planosDAO.add(ouro)
    planosDAO.add(platina)
    planosDAO.add(diamante)

    val listaPlanos = planosDAO.getList()
    println(listaPlanos)
    manager.close()
}
package br.com.alura.alugames.principal
import br.com.alura.alugames.modelo.Gamer
fun main() {
    val gamer1 = Gamer("Jacque", "jacque@email.com")
    println(gamer1)

    val gamer2 = Gamer(
        "Jeni",
        "jeni@email.com",
        "19/19/1992",
        "jeniblo")

    println(gamer2)

    gamer1.let {
        it.dataNascimento = "18/09/2000"
        it.usuario = "jacqueskywalker"

    }.also {
        println(gamer1.idInterno)
    }

    println(gamer1)
    gamer1.usuario = "jacque"
    println(gamer1)
}
package br.com.alura.alugames.utilitario

import br.com.alura.alugames.data.plano.PlanoAssinaturaEntity
import br.com.alura.alugames.data.plano.PlanoAvulsoEntity
import br.com.alura.alugames.data.plano.PlanoEntity
import br.com.alura.alugames.modelo.Plano
import br.com.alura.alugames.modelo.PlanoAssinatura
import br.com.alura.alugames.modelo.PlanoAvulso

fun Plano.toEntity() : PlanoEntity{
    return if (this is PlanoAssinatura) {
        PlanoAssinaturaEntity(
            this.tipo,
            this.mensalidade,
            this.jogosIncluidos,
            this.percentualDescontoReputacao,
            this.id
        )
    } else {
        PlanoAvulsoEntity(
            this.tipo,
            this.id
        )
    }
}

fun PlanoEntity.toModel(): Plano{
    return if (this is PlanoAssinaturaEntity) {
        PlanoAssinatura(
            this.tipo,
            this.mensalidade,
            this.jogosIncluidos,
            this.percentualDescontoReputacao,
            this.id
        )
    } else {
        PlanoAvulso(
            this.tipo,
            this.id
        )
    }
}

eu fiz as alterações no BD mas ainda assim da essa mensagem do ID( agora aparecendo 25), tentei invalidar caches no intelliJ tb e n foi.

Aparentemente está tudo ok, tirando a parte do testeGamerBanco.kt não estar adicionando o plano no gamer e o gamer no banco.

Mas acredito que você tenha tirado para ver se os valores dos modelos estavam ok, sem o stack do erro que atrapalharia na visão do console.

Como o erro mudou de 28 para 25, então aparentemente o seu banco está ok na questão de dados. Porém, há algumas particularidades entre Oracle(seu BD) e MySQL(BD da aula) principalmente na parte de geração de sequence.

Você quer botar o seu código no github e compartilhar aqui? Coloca ele com as partes que estão dando erro mesmo, quero ver se consigo replicar aqui também.

Eu tenho algumas suspeitas:

  • Relacionamento das entidades (especificar o fetch e o cascade -> @ManyToOne(fetch = FetchType.LAZY, cascade = [CascadeType.ALL]));
  • Geração de IDs no Oracle (Deve se utilizar GenerationType.SEQUENCE ou GenerationType.AUTO ao invés de GenerationType.IDENTITY)
  • Adição do plano no DAO de forma diferente;
  • Adição/Alteração ao mesmo tempo, gerando conflito de ids.

Creio fortemente que o problema está nas entidades na forma de gerar as sequences e/ou no relacionamento ManyToOne, por isso que ele não está conseguindo encontrar o id. Provavelmente ele não está conseguindo vincular a sequence daquele id em específico.