Erika, sin exagerar creo que es una de las peores claves primaria que he
visto en mi vida:

<composite-id class="Ausentismo.ClasesDelDominio.IDs.Novedades_Id"name="Id"
unsaved-value="none">
     <key-many-to-one class="Licencias" name="Licencia"
foreign-key="FK_NOV_LIC" lazy="false">
       <column name="ID_LICENCIA" sql-type="number"/>
       <column name="CONTADOR_LIC" sql-type="number" />
     </key-many-to-one>
     <key-many-to-one class="Empleados" name="Empleado"
foreign-key="FK_EMPLEADO" lazy="false">
       <column name="NRO_EMPLEADO"/>
       <column name="CONTADOR"/>
     </key-many-to-one>
     <key-property name="Fecha_desde" column="FECHA_DESDE" type="DateTime"/>
</composite-id>

vos te has dado cuenta que la clave primaria de esa tabla esta compuesta por
CINCO! 5! columnas?

No me quiero imaginar cuando haya algo que apunte a Novedad.

Por otro lado y ya yendo al grano, esta parte me suena rara:

   <many-to-one class="Licencias" foreign-key="FK_NOV_LIC"
insert="false" update="false" lazy="false" name="Licencia">
     <column name="ID_LICENCIA"/>
     <column name="CONTADOR"/>
   </many-to-one>
   <many-to-one class="Empleados" foreign-key="FK_EMPLEADO"
insert="false" update="false" lazy="false" name="Empleado">
     <column name="NRO_EMPLEADO"/>
     <column name="CONTADOR"/>
   </many-to-one>

Como es eso?, lo tenes en la clave primaria y luego lo tenes como
many-to-one? Para que?, si ya lo tenes como key-many-to-one..... Otra cosa
que me suena rara, es que en la clave primaria pusiste:
     <key-many-to-one class="Licencias" name="Licencia"
foreign-key="FK_NOV_LIC" lazy="false">
       <column name="ID_LICENCIA" sql-type="number"/>
       <column name="CONTADOR_LIC" sql-type="number" />
     </key-many-to-one>

osea pusiste CONTADOR_LIC... Sin embargo en la many to one pusiste solo
CONTADOR.


Consejo 1:
La base de datos esta fea, y eso debería entenderlo hasta alguien que no ha
usado un ORM en su vida. Es simplemente un mal diseño.

Consejo 2:
En este escenario, es preferible no mapear algo  dos veces (por mas que
pongas insert="false" update="false"), no parece lógico.
En el peor de los casos si queres tener una propiedad Empleado, podes usar
esto:
public virtual Empleado Empleado {get{ return Id.Empleado; } }
De tipo solo lectura, y no uses esa propiedad para escribir consultas
nhibernate. No le veo mucho sentido.....

Consejo 2:
Tus clases deberían estar en singular: Empleado, Novedad... También hay una
propiedad que se llama "Empleados" , si yo veo esto, esperaría ver una
colección de empleados, sin embargo es una sola entidad empleado.










El 10 de junio de 2010 08:35, Erika Fernández <[email protected]>escribió:

> Carlos: Muchas gracias por tu ayuda. Con respecto a la definicion de
> las columnas, esta es necesaria. de no hacerlo tira la siguiente
> excepcion.
>
> Foreign key (FK_NOV_LIC:T_NOVEDADES [Licencia])) must have same number
> of columns as the referenced primary key (T_LICENCIAS [ID_LICENCIA,
> CONTADOR])
>
> La otra solucion que planteas utilizando el algoritmo hi-lo... estuve
> leyendo la documentacion, pero no me queda claro si se puede utilizar
> con composite-ids.
> La estructura de base de datos, es de un sistema que ya esta en
> producción, por lo cual es imposible (lamentablemente) cambiarla.
>
> Muchas gracias,
>
> Erika
>
> On 9 jun, 19:32, Carlos Cocom <[email protected]> wrote:
> > Hola Erika
> >
> > A simple vista veo que tu mapping dentro de la sección donde defines del
> > composite-id estas definiendo las columnas, lo que parece estar erróneo.
> >
> > Aquí para mas referencia
> >
> > http://nhforge.org/doc/nh/en/index.html#mapping-declaration-id-assigned
> >
> > En lo personal no tenido que utilizar el composite-id no has pensado usar
> un
> > simple id como hi-lo, secuence u otro. Ya que la ventaja que te da en tu
> > repositorio de la forma en que lo utilizas es que no se dupliquen si
> tienes
> > marcado ese como llave primaria.
> >
> > Sin embargo esto lo puedes seguir haciendo, para ello al momento de
> guardar
> > haces un hql para saber si ya existe y evitar duplicados.
> >
> > Carlos
> >
> > El 9 de junio de 2010 14:45, Erika Fernández <[email protected]
> >escribió:
> >
> >
> >
> > > Hola a todos! Tengo un problema con una excepcion que me tira, al
> > > tratar de hacer un SELECT.
> >
> > > Les copio los archivos de mapeo y objetos.
> >
> > > //OBJETOS
> >
> > > namespace Ausentismo.ClasesDelDominio
> > > {
> > >    class Novedades
> > >    {
> > >        public Novedades()
> > >        {
> >
> > >        }
> >
> > >        protected Novedades_Id id;
> >
> > >        public virtual Novedades_Id Id
> > >        {
> > >            get { return id; }
> > >            set { id = value; }
> > >        }
> >
> > >        private Licencias licencia;
> >
> > >        public virtual Licencias Licencia
> > >        {
> > >            get { return licencia; }
> > >            set { licencia = value; }
> > >        }
> >
> > >        protected Empleados empleado;
> >
> > >        public virtual Empleados Empleado
> > >        {
> > >            get { return empleado; }
> > >            set { empleado = value; }
> > >        }
> >
> > >        protected int contador;
> >
> > >        public virtual int Contador
> > >        {
> > >            get { return contador; }
> > >            set { contador = value; }
> > >        }
> >
> > >        protected DateTime fecha_hasta;
> >
> > >        public virtual DateTime Fecha_hasta
> > >        {
> > >            get { return fecha_hasta; }
> > >            set { fecha_hasta = value; }
> > >        }
> >
> > >        protected int cant_dias;
> >
> > >        public virtual int Cant_dias
> > >        {
> > >            get { return cant_dias; }
> > >            set { cant_dias = value; }
> > >        }
> >
> > >        protected string justificada;
> >
> > >        public virtual string Justificada
> > >        {
> > >            get { return justificada; }
> > >            set { justificada = value; }
> > >        }
> >
> > >        protected string usuario_alta;
> >
> > >        public virtual string Usuario_alta
> > >        {
> > >            get { return usuario_alta; }
> > >            set { usuario_alta = value; }
> > >        }
> >
> > >        protected DateTime fecha_alta;
> >
> > >        public virtual DateTime Fecha_alta
> > >        {
> > >            get { return fecha_alta; }
> > >            set { fecha_alta = value; }
> > >        }
> >
> > >        protected string usuario_modif;
> >
> > >        public virtual string Usuario_modif
> > >        {
> > >            get { return usuario_modif; }
> > >            set { usuario_modif = value; }
> > >        }
> >
> > >        protected DateTime fecha_modif;
> >
> > >        public virtual DateTime Fecha_modif
> > >        {
> > >            get { return fecha_modif; }
> > >            set { fecha_modif = value; }
> > >        }
> >
> > >        protected int anio;
> >
> > >        public virtual int Anio
> > >        {
> > >            get { return anio; }
> > >            set { anio = value; }
> > >        }
> >
> > >    }
> >
> > > namespace Ausentismo.ClasesDelDominio.IDs
> > > {
> > >    class Novedades_Id: ISerializable
> > >    {
> > >        public Novedades_Id()
> > >        {
> >
> > >        }
> >
> > >        private Empleados empleado;
> >
> > >        protected virtual Empleados Empleado
> > >        {
> > >            get { return empleado; }
> > >            set { empleado = value; }
> > >        }
> >
> > >        private Licencias licencia;
> >
> > >        protected virtual Licencias Licencia
> > >        {
> > >            get { return licencia; }
> > >            set { licencia = value; }
> > >        }
> >
> > >        protected DateTime fecha_desde;
> >
> > >        protected virtual DateTime Fecha_desde
> > >        {
> > >            get { return fecha_desde; }
> > >            set { fecha_desde = value; }
> > >        }
> >
> > >        // override object.Equals
> > >        public override bool Equals(object obj)
> > >        {
> >
> > >           if (obj == null || GetType() != obj.GetType())
> > >            {
> > >                return false;
> > >            }
> > >            // TODO: write your implementation of Equals() here.
> > >            if ((this.Licencia == ((Novedades_Id)obj).Licencia) &&
> > > this.Empleado==((Novedades_Id)obj).Empleado && this.fecha_desde
> > > ==((Novedades_Id)obj).fecha_desde)
> > >                return true;
> > >            else return false;
> >
> > >        }
> >
> > >        // override object.GetHashCode
> > >        public override int GetHashCode()
> > >        {
> > >            // TODO: write your implementation of GetHashCode() here.
> > >            int hash = 13;
> > >            hash += (null == this.Empleado ? 0 :
> > > this.Empleado.GetHashCode());
> > >            hash += (null == this.Licencia ? 0 :
> > > this.Licencia.GetHashCode());
> > >            hash += (null == this.Fecha_desde ? 0 :
> > > this.Fecha_desde.GetHashCode());
> >
> > >            return hash;
> >
> > >        }
> >
> > >        #region Miembros de ISerializable
> >
> > >        void ISerializable.GetObjectData(SerializationInfo info,
> > > StreamingContext context)
> > >        {
> > >            throw new Exception("The method or operation is not
> > > implemented.");
> > >        }
> >
> > >        #endregion
> > >    }
> >
> > > //ARCHIVO DE MAPEO
> >
> > > <?xml version="1.0" encoding="utf-8" ?>
> > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
> > >                   assembly="Ausentismo"
> > >                   namespace="Ausentismo.ClasesDelDominio">
> > >  <class name="Novedades" table="T_NOVEDADES" schema="SOLIDARIDAD">
> > >    <composite-id class="Ausentismo.ClasesDelDominio.IDs.Novedades_Id"
> > > name="Id" unsaved-value="none">
> > >      <key-many-to-one class="Licencias" name="Licencia" foreign-
> > > key="FK_NOV_LIC" lazy="false">
> > >        <column name="ID_LICENCIA" sql-type="number"/>
> > >        <column name="CONTADOR_LIC" sql-type="number" />
> > >      </key-many-to-one>
> > >      <key-many-to-one class="Empleados" name="Empleado" foreign-
> > > key="FK_EMPLEADO" lazy="false">
> > >        <column name="NRO_EMPLEADO"/>
> > >        <column name="CONTADOR"/>
> > >      </key-many-to-one>
> > >      <key-property name="Fecha_desde" column="FECHA_DESDE"
> > > type="DateTime"/>
> > >      </composite-id>
> > >    <many-to-one class="Licencias" foreign-key="FK_NOV_LIC"
> > > insert="false" update="false" lazy="false" name="Licencia">
> > >      <column name="ID_LICENCIA"/>
> > >      <column name="CONTADOR"/>
> > >    </many-to-one>
> > >    <many-to-one class="Empleados" foreign-key="FK_EMPLEADO"
> > > insert="false" update="false" lazy="false" name="Empleado">
> > >      <column name="NRO_EMPLEADO"/>
> > >      <column name="CONTADOR"/>
> > >    </many-to-one>
> > >    <property name="Contador" column="CONTADOR" type="int"/>
> > >    <property name="Fecha_hasta" column="FECHA_HASTA" type="DateTime"/
> >
> > >    <property name="Cant_dias" column="CANT_DIAS" type="int"/>
> > >    <property name="Justificada" column="JUSTIFICADA" type="string"/>
> > >    <property name="Fecha_alta" column="FECHA_ALTA" type="DateTime"/>
> > >    <property name="Usuario_alta" column="USUARIO_ALTA" type="string"/
> >
> > >    <property name="Fecha_modif" column="FECHA_MODIF" type="DateTime"/
> >
> > >    <property name="Usuario_modif" column="USUARIO_MODIF"
> > > type="string"/>
> > >    <property name="Anio" column="ANIO" type="int"/>
> > >  </class>
> > > </hibernate-mapping>
> >
> > > //HQL
> >
> > >  public IList buscarNovedades(Empleados empleado, DateTime fechaDesde,
> > > DateTime fechaHasta)
> > >        {
> > >            session = HibernateUtil.SessionFactory.OpenSession();
> >
> > >            ITransaction transaction = session.BeginTransaction();
> >
> > >            String sql = "from Novedades n where n.Id.Empleado
> > > = :empleado ";
> > >            //sql += " and n.Id.Fecha_desde between :fechaDesde
> > > and :fechaHasta";
> > >            IQuery q = session.CreateQuery(sql);
> > >            q.SetParameter("empleado", empleado);
> > >            q.SetDateTime("fechaDesde", fechaDesde);
> > >            q.SetDateTime("fechaHasta", fechaHasta);
> > >            IList listaMovimientos = q.List();
> >
> > >            session.Close();
> > >            if (listaMovimientos.Count != 0)
> > >                return listaMovimientos;
> > >            else return null;
> > >        }
> >
> > >        }
> > >    }
> >
> > > La excepcion que tira es la siguiente: SqlNode's text did not
> > > reference expected number of columns
> >
> > > Supongo el problema es con mi composite-id, pero no encuentro nada que
> > > me ayude. Por favor!!! si alguien sabe algo, me vendria muy bien..
> > > Gracias desde ya.
> >
> > > Erika
> >
> > > --
> > > Para escribir al Grupo, hágalo a esta dirección:
> > > [email protected]
> > > Para más, 
> > > visite:http://groups.google.com/group/NHibernate-Hispano-Ocultar texto de 
> > > la cita -
> >
> > - Mostrar texto de la cita -
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a