2
respostas

Problema - Relacionamento many-to-one

Boa Tarde,

Tentei realizar o mesmo relacionamento do curso, porém apresenta essa mensage, que não inicializa a lista.

could not initialize a collection: [prjTeste.Entidades.Companhia.ListaBusiness#1][SQL: SELECT listabusin0.CompanhiaId as Compan5_2_1, listabusin0.IdBusiness as IdBusi1_2_1, listabusin0.IdBusiness as IdBusi1_2_0, listabusin0.BusinessCodigo as Busine2_2_0, listabusin0.Nome as Nome3_2_0, listabusin0.CNPJ as CNPJ4_2_0, listabusin0.CompanhiaId as Compan5_2_0 FROM Business listabusin0 WHERE listabusin0.CompanhiaId=?]

Business.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  assembly="prjTeste"
  namespace="prjTeste.Entidades">
  <class name="Business">
    <id name="IdBusiness">
      <generator class="identity" />
    </id>
    <property name="BusinessCodigo" />
    <property name="Nome" />
    <property name="CNPJ" />
    <many-to-one name="CompanhiaId" class="Companhia" fetch="join"/>
  </class>
</hibernate-mapping>

Classe Business

    public class Business
    {
        public virtual Companhia CompanhiaId { get; set; }
        public virtual int IdBusiness { get; set; }
        public virtual string BusinessCodigo { get; set; }
        public virtual string Nome { get; set; }
        public virtual string CNPJ { get; set; }
    }

Classe BusinessDAO

    class BusinessDAO
    {
        private ISession session;

        public BusinessDAO(ISession session)
        {
            this.session = session;
        }

        public void Add(Business business)
        {
            ITransaction transacao = session.BeginTransaction();
            if (business.IdBusiness != 0)
            {
                session.Update(business);
            }
            else
            {
                session.Save(business);
            }
            transacao.Commit();
        }

        public Business BuscaPorIdNumber(int IdBusiness)
        {
            return session.Get<Business>(IdBusiness);
        }

        public IList<Business> ListBusiness()
        {
            //IQuery query = session.CreateQuery("from Imposto");
            //IList<Imposto> listImposto = query.List<Imposto>();

            //return listImposto;

            ICriteria criteria = session.CreateCriteria<Business>();

            return criteria.List<Business>();
        }
    }

Companhia.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  assembly="prjTeste"
  namespace="prjTeste.Entidades">
  <class name="Companhia">
    <id name="IdCompanhia">
      <generator class="identity" />
    </id>
    <property name="CompanhiaCodigo" />
    <property name="Nome" />
    <bag name="ListaBusiness" fetch="join">
      <key column="CompanhiaId"/>
      <one-to-many class="Business"/>
    </bag>
  </class>
</hibernate-mapping>

Classe Companhia

    public class Companhia
    {
        public virtual int IdCompanhia { get; set; }
        public virtual string CompanhiaCodigo { get; set; }
        public virtual string Nome { get; set; }
        public virtual IList<Business> ListaBusiness { get; set; }
    }

Classe CompanhiaDAO

    class CompanhiaDAO
    {
        private ISession session;

        public CompanhiaDAO(ISession session)
        {
            this.session = session;
        }

        public void Add(Companhia companhia)
        {
            ITransaction transacao = session.BeginTransaction();
            if (companhia.IdCompanhia != 0)
            {
                session.Update(companhia);
            }
            else
            {
                session.Save(companhia);
            }
            transacao.Commit();
        }

        public Companhia BuscaPorIdNumber(int IdCompanhia)
        {
            return session.Load<Companhia>(IdCompanhia);
        }

        public IList<Companhia> ListCompanhia()
        {
            //IQuery query = session.CreateQuery("from Imposto");
            //IList<Imposto> listImposto = query.List<Imposto>();

            //return listImposto;

            ICriteria criteria = session.CreateCriteria<Companhia>();

            return criteria.List<Companhia>();
        }
    }
2 respostas

Olá, Felipe, precisamos dos detalhes do InnerException do erro que está ocorrendo. Pode postar aqui o InnerException para darmos uma olhada? Obrigado!

Olá Marcelo,

Então verifiquei que havia criado as tabelas manualmente e não pelo nhibernate, por isso não foi criado o relacionamento.

Removi as tabelas e criei pelo nhibernate com o comando:

new SchemaExport(cfg).Create(true, true);

Porém, criei uma nova classe e a mesma não foi gerada no banco.

Troquei o comando para:

new SchemaUpdate(cfg).Execute(true, true);

e no hibernate.cfg.xml, está dessa forma:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration
xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="dialect">NHibernate.JetDriver.JetDialect, NHibernate.JetDriver</property>
    <property name="connection.driver_class">NHibernate.JetDriver.JetDriver, NHibernate.JetDriver</property>
    <property name="connection.connection_string">Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\felipe\Documents\Visual Studio 2010\Projects\prjForm\bin\Debug\banco\prjTaxForm.accdb</property>
    <property name="hbm2ddl.auto">update</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
  </session-factory>
</hibernate-configuration>

E não cria a tabela, não sei aonde está errado.