Jose, como mencioné al final de mi ultimo mensaje, la estructura de
datos ya esta definida y no puede ser cambiada.

Encontre cual era mi problema. Esta mal la PK en la base de datos,
porque un objeto empleado tiene como PK los campos NRO_EMPLEADO y
CONTADOR. Pero en la tabla solo el campo NRO_EMPLEADO formaba parte de
la PK, lo cual es un error, porque seria un objeto incompleto.
Agregando el CONTADOR a la PK, entonces se fue el problema.

Muchas gracias a todos.

Erika

On 10 jun, 09:09, José F. Romaniello <[email protected]> wrote:
> 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">
>
> ...
>
> leer más »- 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

Responder a