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

[Dúvida] Error while committing the transaction

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

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

Esse erro ocorre quando executo o codigo, ele não consegue subir os dados

2 respostas
solução!

Olá, Lucas!

Pelo erro apresentado nas imagens e pelo contexto da atividade, parece que você está enfrentando um problema comum ao persistir dados que envolvem relações entre entidades no Hibernate. O erro TransientPropertyValueException indica que você está tentando salvar uma entidade que possui uma referência a outra entidade que ainda não foi persistida no banco de dados.

Na sua classe AluguelEntity, você tem relações @ManyToOne com GamerEntity e JogoEntity. Antes de salvar um AluguelEntity, você precisa garantir que as instâncias de GamerEntity e JogoEntity referenciadas por ele já estejam salvas no banco de dados.

No código da sua função main(), você está buscando um user e um jogo, e então criando um novo aluguel com esses objetos. No entanto, para garantir que o user (que parece ser um GamerEntity) e o jogo (que parece ser um JogoEntity) já estejam persistidos, você deve salvá-los explicitamente antes de tentar persistir o aluguel. Se eles já foram salvos anteriormente e você está apenas recuperando-os do banco de dados, então esse não deveria ser o problema.

Outra coisa a verificar é se os objetos que você está passando para AluguelEntity estão completos e não apenas referências proxy que podem não ter sido inicializadas.

Aqui está um exemplo de como você poderia ajustar o código para garantir que as entidades relacionadas sejam persistidas antes de AluguelEntity:

fun main() {
    val manager = Banco.getEntityManager()
    val jogoDAO = JogosDAO(manager)
    val userDAO = UserDAO(manager)
    val aluguelDAO = AluguelDAO(manager)

    // Iniciar uma transação
    manager.transaction.begin()

    // Buscar ou criar e salvar as entidades relacionadas
    val user = userDAO.getItem(id: 1) ?: // Crie e salve um novo UserEntity
    val jogo = jogoDAO.getItem(id: 3) ?: // Crie e salve um novo JogoEntity

    // Criar o aluguel com as entidades relacionadas
    val aluguel = user.alugaJogo(jogo, Periodo())

    // Persistir o aluguel
    aluguelDAO.addTable(aluguel)

    // Commit da transação
    manager.transaction.commit()

    // Fechar o EntityManager
    manager.close()
}

Lembre-se de que você precisa iniciar uma transação com manager.transaction.begin() e commitá-la com manager.transaction.commit() após realizar as operações de persistência. Isso garante que todas as operações sejam realizadas como uma unidade de trabalho atômica.

Espero que essas informações te ajudem a resolver o problema. Caso o erro persista, verifique se as instâncias de GamerEntity e JogoEntity estão corretas e se não há nenhum problema com a configuração das relações no Hibernate.

Espero ter ajudado e bons estudos!

Muito obrigado! Realmente o problema era referencia de objetos em outras tabelas, com esse entendimento percebi que na verdade o problema era na classe User, onde o ID não estava sendo salvo corretamente, fazendo com que no momento que o User fosse buscado, não fosse encontrado na tabela, pois ele sempre era carregado com o ID = 0

Ainda sim, isso foi muito útil para me guiar ate o problema, novamente, muito obrigado!

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