2
respostas

[Dúvida] Erro ao tentar executar a aplicação, devido a erro SQL

Desde o primeiro exercício "Vamos Praticar" que fez o desafio (converter para Hibernate) para criar os mesmos códigos da Classe Jogos para a classe Gamers, a aplicação parou de compilar. Inicialmente pela ausência da tabela gamers.

Criei a tabela gamers usando o comando sql abaixo:

CREATE TABLE gamers (
            id INT AUTO_INCREMENT PRIMARY KEY,
            nome VARCHAR(100),
            email VARCHAR(100),
            dataNascimento DATETIME,
            usuario VARCHAR(100))

Após a criação, o seguinte erro aparece, mesmo tento criado a classe GamerEntity e estar utilizando-a na GamersDAO :

Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: gamers, for columns: [org.hibernate.mapping.Column(jogosAlugados)]

Seguem as informações:

GamerEntity.kt

@Entity
@Table(name = "gamers")
class GamerEntity(
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    var id: Int = 0,
    val nome: String = "Nome do Gamer",
    val email: String = "email@email.com",
    val dataNascimento:String? = null,
    val usuario:String? = null) {
}

Declaração da GamersDAO

class GamersDAO(manager: EntityManager): DAO<Gamer, GamerEntity>(manager, GamerEntity::class.java)

Alguém saberia dizer o que devo corrigir ?

Desde já agradeço!

2 respostas

Acredito que o problema está relacionado ao mapeamento da propriedade jogosAlugados na sua classe GamerEntity. O errodiz que o Hibernate não conseguiu determinar o tipo para essa propriedade. Pra resolver isso, cê precisa mapear corretamente a relação entre a classe GamerEntity e a classe Jogo.

Vamos assumir que a relação entre GamerEntity e Jogo seja de muitos para muitos (um gamer pode ter muitos jogos e um jogo pode pertencer a muitos gamers). Se for esse o caso, você precisará adicionar a anotação @ManyToMany na propriedade jogosAlugados.

@ManyToMany
@JoinTable(
    name = "gamer_jogo",
    joinColumns = [JoinColumn(name = "gamer_id")],
    inverseJoinColumns = [JoinColumn(name = "jogo_id")]
)
var jogosAlugados: List<Jogo> = mutableListOf()

Lembra de ajustar os detalhes conforme a estrutura real do seu banco de dados e do relacionamento entre as entidades GamerEntity e Jogo.

Olá Estudante!

Muito Obrigado pela resposta. Tentarei implementar sua sugestão, apesar de não ter sido abordada no curso.

Mesmo que num sistema real este relacionamento que você indicou seja o mais comum, no curso foram criadas as classes JogosEntity e GamersEntity com o objetivo de não ser necessário armazenar todas as informações das classes Jogos e Games. Ou seja, são persistidos apenas os atributos que foram definidos.

Minha dúvida ainda continua: se o atributo jogosAlugados não foi definido na Classe GamersEntity para ser persistido, por que motivo o Hibernate está dando erro, como se ela fosse necessária ?

Outra dúvida, agora sobre a sua sugestão. Nas classes Jogo e Game existe o campo id. Como referencio que o campo jogo_id se refere ao campo id da tabela Jogos e o gamer_id ao campo id da tabela Gamers ?

Desde já agradeço pela ajuda!

ps: primeira vez que uso o Hibernate. Peço desculpas se a dúvidas são muito simples