5
respostas

Erro no session.Save(umaCategoria);

Não consegui passar e finalizar o curso do vídeo logo no session.Save(umaCategoria);

Fazendo todos os passos professor Victor, eu obtive isso : ao executar o programa.

GenericADOException was unhandled

An unhandled exception of type 'NHibernate.Exceptions.GenericADOException' occurred in NHibernate.dll

Additional information: could not insert: [Loja.Entidades.Categoria][SQL: INSERT INTO Categoria (Nome) VALUES (?);SELECT LAST_INSERT_ID()]

5 respostas

Oi, Anthony!

Precisamos de mais informações para tentar ajudar no erro. Tente colocar aqui o texto completo do erro e o seu código completo de onde está o session.Save(umaCategoria).

No vídeo da aula 2 exatamente aos 9 minutos do vídeo fiz da mesma forma como o professor Victor fez em seu vídeo. No texto da aula, essa parte está alterada

using Loja.DAO;
using Loja.Entidades;
using Loja.Infra;
using NHibernate;
using NHibernate.Cfg;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Loja
{
     class Program
    {
        static void Main(string[] args)
        {
            Categoria umaCategoria = new Categoria();
            umaCategoria.Nome = "Uma Categoria";

            Produto produto = new Produto();
            produto.Nome = "Camiseta";
            produto.Preco = 10;

            produto.Categoria = umaCategoria;

            ISession session = NHibernateHelper.AbreSession();
            ITransaction transacao = session.BeginTransaction();

            session.Save(umaCategoria);

            session.Save(produto);
            transacao.Commit();
            session.Close();



            Console.Read();
        }
    }
}

Porém quando executamos esse código, o NHibernate joga uma exceção pois tentamos associar uma nova categoria, que está no estado Transient, com o produto que está sendo gravado. O nome dessa exceção é TransientObjectException. A TransientObjectException ocorre sempre que tentamos gravar um relacionamento com um objeto que está no estado Transient. Para evitar a exceção, precisamos fazer com que a categoria será associada com o produto esteja no estado Persistent, ou seja, antes de gravar o produto precisamos gravar a categoria:

Produto produto = new Produto();
// inicializa o produto
Categoria categoria = new Categoria();
// inicializa a categoria
produto.Categoria = Categoria;

ITransaction transacao = session.BeginTransaction();
session.Save(categoria);
session.Save(produto);
transacao.Commit();

Mesmo que eu faça destes dois modos, ainda gera uma Exception indicando o ponto do erro logo no session.Save(umaCategoria); e não consigo sair deste ponto em diante. Todos os métodos estão instanciados no namespace using, e como é início de aula, a base de código está cru e com pouca implementação para gerar algum conflito de dependências, mesmo que as atuais já tenham sido adicionadas, NHibernate, DAO, Infra, etc..

Como demonstrado na explicação em texto da aula abaixo, eu não posso tirar o

ISession session = NHibernateHelper.AbreSession();

Pois não poderia gerar o

ITransaction transacao = session.BeginTransaction();

Eu estou com o mesmo problema do amigo acima.

Você conseguiu resolver Anthony Walter?

Alias eu resolvi da seguinte maneira,

Chamei o NHibernateHelper.GeraSchema() para recriar meu Schema e então criar as tabelas Produto e Categoria, para só então salvar no banco algum dado...

E fiz uma alteração dentro do método alterando o segundo parametro do new SchemaExport(cfg).Create(true, false); para quando o mesmo for recriar o meu Schema não dar Drop nas minhas entidades já existentes. Não faria sentido a cada vez que eu for criar uma nova entidade eu ter que regerar todo Schema.

Tambem precisei inserir uma nova propriedade na configuração do hbm. "property name="hbm2ddl.auto">update" pra ele atualizar o banco quando eu criar uma nova propriedade na minha classe de entidade. Senao ele nao criar colunas novas por exemplo.

Todavia, desta maneira funcionou.

Fico no aguardo de uma solução mais "Inteligente" que a minha, pois acho q acabei fazendo uma Gambiarra.

Abraço;