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
