NHibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

20 views
Skip to first unread message

Antonio Kuroki

unread,
Mar 3, 2017, 9:57:04 AM3/3/17
to NHibernate-Br
Pessoal,

estou tentando fazer uma aplicação que vai rodar em ASP.net MVC usando Nhibernat + Fluent e estou com o seguinte problema:

Ao consultar um pedido e tentar alterar da um erro acima "NHibernate.HibernateException: Illegal attempt to associate a collection with two open sessions".
segue meu codigo:

console app para rodar o teste:

main{
int codPedido = 22;
                IList<Produto> produtos = produtoDao.listarTodos();
                Pedido pedido = pedidoDao.consultarPorId(codPedido);
                if (pedido == null)
                {
                    pedido = new Pedido()
                    {
                        Cliente = cliente,
                        Produtos = produtos
                    };

                    pedidoDao.incluir(pedido);
                    pedido = pedidoDao.consultarPorId(codPedido);
                }
                else
                {
                    pedido.Produtos.Clear();
                    pedido.Produtos.Add(produtos.FirstOrDefault());
                    pedidoDao.salvar(pedido); //aqui da o errro
                }

}


 public ProdutoMap()
        {
            Id(x => x.Id);
            Map(x => x.Descricao);
            Map(x => x.Modelo);
            Map(x => x.Fabricante);

            References(x => x.Categoria).Column("Id_Categoria");
            HasManyToMany<Pedido>(x => x.Pedidos).ParentKeyColumn("Id_Produto").ChildKeyColumn("Id_Pedido").Cascade.SaveUpdate().Inverse().Table("Pedido_Produto");
        }

public PedidoMap()
        {
            Id(x => x.Id);

            References(x => x.Cliente).Column("Id_Cliente");
            HasManyToMany<Produto>(x => x.Produtos).ParentKeyColumn("Id_Pedido").ChildKeyColumn("Id_Produto").Table("Pedido_Produto").Cascade.SaveUpdate();
        }

 public class HibernateHelper
    {
        private static readonly object factorylock = new object();
        private static HibernateHelper hibernateHelper;
        //private Configuration configuration;
        private ISessionFactory _sessionFactory;

        private HibernateHelper()
        {
            try
            {
                lock (factorylock)
                {
                    MsSqlConfiguration config2 = MsSqlConfiguration.MsSql2008;
                    config2.ConnectionString("data source=.;initial catalog=DBTeste;integrated security=True;"); //Server=.; Database=/banco/BdLocalTeste.mdf; Integrated Security=SSPI;
                    config2.ShowSql();
                    config2.FormatSql();

                    _sessionFactory = Fluently.Configure()
                        .Database(config2)
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Categoria>())
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Cliente>())
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Pedido>())
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Produto>())
                        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Usuario>())
                        .BuildSessionFactory();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        public static HibernateHelper getInstance()
        {
            try
            {
                if (hibernateHelper == null)
                {
                    hibernateHelper = new HibernateHelper();
                }
            }
            catch (Exception)
            {
                throw;
            }

            return hibernateHelper;
        }

        public ISessionFactory SessionFactory
        {
            get { return _sessionFactory; }

        }

        public ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }
    }

public abstract class HibernateDao<TEntity, TId> : IDAO<TEntity, TId>
        where TEntity : EntidadeBasica<TId>
        where TId : IEquatable<TId>
    {

        private HibernateHelper _hibernateHelper;


        public HibernateDao()
        {
            try{
                _hibernateHelper = HibernateHelper.getInstance();
            }
            catch (Exception)
            {
                throw;
            }
        }


        #region atribtos hibernate

            protected HibernateHelper HibernateHelper
            {
                get { return _hibernateHelper; }
            }

        #endregion

        #region metodos genericos

            //[Transaction(ReadOnly = false)]
            public void incluir(TEntity entidade)
            {
                ISession session = null;
                ITransaction transaction = null;

                try
                {
                    session = HibernateHelper.OpenSession();
                    transaction = session.BeginTransaction();

                    entidade.DataCriacao = DateTime.Now;
                    session.Save(entidade);
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    if (transaction.IsActive && !transaction.WasCommitted)
                    {
                        transaction.Rollback();
                    }
                    throw;
                }
                finally
                {
                    //if (session.IsConnected && session.IsOpen)
                    //{
                    //    session.Close();
                    //}
                }
            }

            //[Transaction(ReadOnly = false)]
            public void salvar(TEntity entidade)
            {
                ISession session = null;
                ITransaction transaction = null;

                try
                {
                    session = HibernateHelper.OpenSession();
                    transaction = session.BeginTransaction();

                    entidade.DataAlteracao = DateTime.Now;
                    //session.SaveOrUpdate(entidade);
                    session.Update(entidade);
                    transaction.Commit();
                }
                catch (Exception e)
                {
                    if (transaction.IsActive && !transaction.WasCommitted)
                    {
                        transaction.Rollback();
                    }
                    throw;
                }
                finally
                {
                    //if (session.IsConnected && session.IsOpen)
                    //{
                    //    session.Close();
                    //}
                }
            }

            //[Transaction(ReadOnly = false)]
            public void delete(TEntity entidade)
            {
                //CurrentSession.Delete(entidade);
            }

            //[Transaction(ReadOnly = true)]
            public TEntity consultarPorId(TId Id)
            {
                ISession session = null;
                TEntity resultado = null;
                try
                {
                    session = HibernateHelper.OpenSession();
                    resultado = session.Get<TEntity>(Id);
                }
                catch (Exception e)
                {
                    throw new Exception(String.Format("Erro consultando o objeto do tipo {0}", typeof(TEntity)), e);
                }
                finally
                {
                    //if (session.IsConnected && session.IsOpen)
                    //{
                    //    session.Close();
                    //}
                }

                return resultado;
            }

            //[Transaction(ReadOnly = true)]
            public IList<TEntity> listarTodos()
            {
                //ICriteria criteria = HibernateHelper.CurrentSession.CreateCriteria<TEntity>();
                //return criteria.List<TEntity>();

                ISession session = null;
                IList<TEntity> resultado = null;
                try
                {
                    session = HibernateHelper.OpenSession();
                    ICriteria criteria = session.CreateCriteria<TEntity>();
                    resultado = criteria.List<TEntity>();
                }
                catch (Exception e)
                {
                    throw new Exception(String.Format("Erro listando o objeto do tipo {0}", typeof(TEntity)), e);
                }
                finally
                {
                    //if (session.IsConnected && session.IsOpen)
                    //{
                    //    session.Close();
                    //}
                }

                return resultado;
            }

            public IList<TEntity> listarCriteria(TEntity obj)
            {
                ISession session = null;
                IList<TEntity> resultado = null;
                try
                {
                    obj.DataAlteracao = null;
                    obj.DataCriacao = null;

                    session = HibernateHelper.OpenSession();
                    ICriteria criteria = session.CreateCriteria<TEntity>();
                    resultado = criteria.Add(Example.Create(obj)).List<TEntity>();
                }
                catch (Exception e)
                {
                    throw new Exception(String.Format("Erro listando o objeto do tipo {0}", typeof(TEntity)), e);
                }
                finally
                {
                    //if (session.IsConnected && session.IsOpen)
                    //{
                    //    session.Close();
                    //}
                }

                return resultado;
            }

        #endregion
    }


Notem que as sessoes nunca sao fechadas pois dará erro de lezyload na hora de buscar os produtos do pedido por exemplo.
Acredito que por elas nunca serem fechadas, esse erro esta acontecendo porem nao sei como resolver!
alguem pode me ajudar?

Reply all
Reply to author
Forward
0 new messages