Persisitiendo una colleción de tipo Value Object (Component)

20 views
Skip to first unread message

Jorge Caballero

unread,
May 23, 2013, 9:18:07 AM5/23/13
to nhibernat...@googlegroups.com
Hola a todos

Estoy atravesando por el siguiente problema. He definido las siguientes clases:

	public class ReducedModalityReductionDataSet : Entity<Guid>
	{
		public ReducedModalityReductionDataSet()
		{
			ReducedModalityReductionDataSetItems = new Iesi.Collections.Generic.HashedSet<ReducedModalityReductionDataSetItem>();
		}
 
		public virtual System.Int32 DataSetNumber { getset; }
		public virtual System.String DataSetName { getset; }
		public virtual System.String Company { getset; }
		public virtual System.Byte Status { getset; }
 
		public virtual ISet<ReducedModalityReductionDataSetItem> ReducedModalityReductionDataSetItems { getprotected set; }
 
		public virtual void AddReductionDataSetItem(ReducedModalityReductionDataSetItem reductionItem)
		{
			reductionItem.ReducedModalityReductionDataSet = this;
			ReducedModalityReductionDataSetItems.Add(reductionItem);
		}
	}

	public class ReducedModalityReductionDataSetItem
	{
		public ReducedModalityReductionDataSetItem()
		{
			ReducedModalityReductionDataSetPeriods = new Iesi.Collections.Generic.HashedSet<ReducedModalityReductionDataSetPeriod>();
		}
 
		public virtual System.Guid Id { getset; }
		public virtual System.String Cuil { getset; }
		public virtual Nullable<System.DateTime> FechaAlta { getset; }
		public virtual System.String Modalidad { getset; }
 
		public virtual ReducedModalityReductionDataSet ReducedModalityReductionDataSet { getset; }
		public virtual ISet<ReducedModalityReductionDataSetPeriod> ReducedModalityReductionDataSetPeriods { getprotected set; }
 
		public virtual void AddPeriod(ReducedModalityReductionDataSetPeriod period)
		{
			period.ReducedModalityReductionDataSetItem = this;
			ReducedModalityReductionDataSetPeriods.Add(period);
		}
	}

	public class ReducedModalityReductionDataSetPeriod : ComponentBase
	{
		public virtual System.Int32 MonthNumber { getset; }
		public virtual System.String MonthYear { getset; }
		public virtual System.String ReductionValue { getset; }
 
		public virtual ReducedModalityReductionDataSetItem ReducedModalityReductionDataSetItem { getset; }
 
		public override bool Equals(object entity)
		{
			if (entity == null)
				return false;
 
			if (ReferenceEquals(this, entity))
				return true;
 
			return false;
		}
 
		public override int GetHashCode()
		{
			return this.MonthNumber.GetHashCode() +
				this.MonthYear.GetHashCode() +
				this.ReductionValue.GetHashCode();
		}
	}

En la clase ReducedModalityReductionDataSetItem he definido un colección de tipo  ReducedModalityReductionDataSetPeriod el cual está definido como component en el archivo HBM:

	<class name="ReducedModalityReductionDataSetItem" table="ReducedModalityReductionDataSetItem" schema="dbo">
		<id name="Id" access="property" column="Id">
			<generator class="assigned" />
		</id>
 
		<property name="Cuil" type="System.String" column="Cuil" />
		<property name="FechaAlta" type="System.DateTime" column="FechaAlta" />
		<property name="Modalidad" type="System.String" column="Modalidad" />
 
		<many-to-one name="ReducedModalityReductionDataSet" class="ReducedModalityReductionDataSet" column="DataSet_Id" />
		
		<set name="ReducedModalityReductionDataSetPeriods" table="ReducedModalityReductionDataSetPeriod" lazy="true" order-by="MonthNumber">
			<key column="DataSetItem_Id" />
			
			<composite-element class="ReducedModalityReductionDataSetPeriod">
				<parent name="ReducedModalityReductionDataSetItem" />
				<property name="MonthNumber" type="System.Int32" column="MonthNumber" not-null="true" />
				<property name="MonthYear" type="System.String" column="MonthYear" not-null="true" />
				<property name="ReductionValue" type="System.String" column="ReductionValue" not-null="true" />
			</composite-element>
		</set>
	</class>

Los datos para persistir son obtenidos a través de archivos excel, los cuales pueden ser seleccionado de manera multiple.

Se iniciá una transacción y se hace un COMMIT (o ROLLBACK, si hay un error) cada vez que se lee un archivo. Al recorrer los archivos y empezar a guardar los datos, los datos con el primer archivo lo persiste correctamente. Al leer el segundo archivo y durante el COMMIT, veo en el archivo LOG (configurado con log4net), veo que se crean ejecutan varias sentencias DELETE.

Log file extract:

2013-05-23 09:48:19,715 [PayrollAppClientThread] DEBUG NHibernate.SQL [(null)] - 
    
	DELETE 
	FROM
        ReducedModalityReductionDataSetPeriod 
	WHERE
        DataSetItem_Id = @p0 
        AND MonthNumber = @p1 
        AND MonthYear = @p2 
        AND ReductionValue = @p3;
    
	@p0 = cd7ac39f-fa74-4571-abf3-7a2ec1b7a363 [Type: Guid (0)], @p1 = 2 [Type: Int32 (0)], @p2 = 'FEB-13' [Type: String (4000)], @p3 = '201' [Type: String (4000)]

2013-05-23 09:48:19,828 [PayrollAppClientThread] DEBUG NHibernate.SQL [(null)] - 
    
	DELETE 
	FROM
        ReducedModalityReductionDataSetPeriod 
	WHERE
        DataSetItem_Id = @p0 
        AND MonthNumber = @p1 
        AND MonthYear = @p2 
        AND ReductionValue = @p3;
    
	@p0 = cd7ac39f-fa74-4571-abf3-7a2ec1b7a363 [Type: Guid (0)], @p1 = 3 [Type: Int32 (0)], @p2 = 'MAR-13' [Type: String (4000)], @p3 = '201' [Type: String (4000)]

2013-05-23 09:48:19,921 [PayrollAppClientThread] DEBUG NHibernate.SQL [(null)] - 
    
	DELETE 
	FROM
        ReducedModalityReductionDataSetPeriod 
	WHERE
        DataSetItem_Id = @p0 
        AND MonthNumber = @p1 
        AND MonthYear = @p2 
        AND ReductionValue = @p3;
    
	@p0 = cd7ac39f-fa74-4571-abf3-7a2ec1b7a363 [Type: Guid (0)], @p1 = 4 [Type: Int32 (0)], @p2 = 'ABR-13' [Type: String (4000)], @p3 = '201' [Type: String (4000)]

Y se queda así de manera indefinida.

Me gustaría saber por que sucede esto y si tengo que tener en cuenta alguna configuración adicional.

Espero que me puedan ayudar con este problema.

Muchas gracias de antemano.
Reply all
Reply to author
Forward
0 new messages