1
resposta

[Bug] Erro getter methods no PlanoEntity get id

Estou recebendo esse erro quando tento rodar o TesteGamerBanco para criar um gamer com um plano no db.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu código do arquivo PlanoEntity:

package br.com.alura.alugames.dados

import javax.persistence.*

@Entity
@Table(name = "planos")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TipoPlano", discriminatorType = DiscriminatorType.STRING)
sealed class PlanoEntity(
    val tipo: String,
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int = 0)

@Entity
@DiscriminatorValue("Avulso")
class PlanoAvulsoEntity(tipo: String = "Plano Avulso", id: Int = 0): PlanoEntity(tipo, id)

@Entity
@DiscriminatorValue("Assinatura")
class PlanoAssinaturaEntity(
    tipo: String = "Plano Assinatura",
    val mensalidade: Double = 0.0,
    val jogosIncluidos: Int = 0,
    val percentualDescontoReputacao: Double = 0.0,
    id: Int = 0): PlanoEntity(tipo, id)
1 resposta

Olá, tudo bem?

O erro que você está enfrentando ocorre porque o Hibernate está tentando criar um proxy para a classe PlanoEntity, mas não consegue acessar o método getId porque ele é final. No Hibernate, métodos utilizados para lazy loading não podem ser final.

Para resolver esse problema, você precisa garantir que os métodos getter e setter das suas entidades não sejam final. No seu caso, o método getId está sendo gerado automaticamente pelo Kotlin, e como você está usando propriedades val e var diretamente no construtor, o Kotlin está gerando métodos final para essas propriedades.

Uma solução é declarar as propriedades fora do construtor principal e fornecer getters e setters explícitos, garantindo que eles não sejam final. Veja como você pode fazer isso:

package br.com.alura.alugames.dados

import javax.persistence.*

@Entity
@Table(name = "planos")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TipoPlano", discriminatorType = DiscriminatorType.STRING)
sealed class PlanoEntity(
    val tipo: String
) {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int = 0
        protected set
}

@Entity
@DiscriminatorValue("Avulso")
class PlanoAvulsoEntity(tipo: String = "Plano Avulso") : PlanoEntity(tipo)

@Entity
@DiscriminatorValue("Assinatura")
class PlanoAssinaturaEntity(
    tipo: String = "Plano Assinatura",
    val mensalidade: Double = 0.0,
    val jogosIncluidos: Int = 0,
    val percentualDescontoReputacao: Double = 0.0
) : PlanoEntity(tipo)

Com essa mudança, o Hibernate será capaz de criar proxies para suas entidades sem problemas.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.