Buen dia a todos, Estoy implementando una estrategia de interception con proxies para mis entidades de dominio utilizando Spring.Aop. Debido a que requiero compatibilidad con NHibernate para con los proxies utilize una guia dada por ayende <http://ayende.com/blog/4106/nhibernate-inotifypropertychanged> sin embargo los proxies los genero con Spring. Estos proxies no pude hacer override al GetType debido a restricciones del framework pero NHibernate requiere el GetType de la entidad para identificar su configuracion, asi que para ello, y siguiendo las indicaciones del post de ayende, sobreescribi el metodo GetEntityName del interceptor para que en el momento que NHibernate solicite el tipo de la entidad yo pudiera extraerlo de la entidad envuelta por el proxy y no del proxy directamente. Sin embargo, al momento de hacer commit a la transaccion ocurre una exception de "Unknown entity class : DecoratorAopProxy .........". Verificando internamente me doy cuenta que NHibernate esta llamando directamente el SessionImpl.GetClassPersister(obj.GetType()) donde obj es la instancia del proxy, en lugar de llamar al interceptor.GetEntityName para obtener el Type de la entidad.
Cosas para aclarar: 1. Estoy usando NH 2.0 (Aun la compania esta en proceso de cambio al 3.2 pero eso toma tiempo) 2. Los Ids de las entidades los estoy asignando yo y le informo a NHibernate sobreescribiendo el IsTransient() del interceptor. 3. Las entidades que tienen los proxies se guardan automaticamente ya que sus padres las tienen asociadas con un cascade="all". 4. El metodo SessionImp.GetClassPersister que genera la exception es llamdo por medio del metodo "SaveWithGeneratedOrRequestedId" de la sesion. Por ultimo les dejo el stacktrace de la exception y agradezco de antemano cualquier colaboracion al respecto. Si requieren mas detalles no duden en preguntar. Nestor Rodriguez at NHibernate.Impl.SessionFactoryImpl.GetEntityPersister(Type theClass) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionFactoryImpl.cs:line 781 at NHibernate.Impl.SessionImpl.GetClassPersister(Type theClass) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionImpl.cs:line 1231 at NHibernate.Impl.SessionImpl.GetEntityPersister(Object obj) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionImpl.cs:line 1239 at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\AbstractSaveEventListener.cs:line 107 at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:line 162 at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:line 148 at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:line 76 at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\DefaultSaveOrUpdateEventListener.cs:line 53 at NHibernate.Impl.SessionImpl.FireSaveOrUpdate(SaveOrUpdateEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionImpl.cs:line 2177 at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionImpl.cs:line 458 at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\CascadingAction.cs:line 252 at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 213 at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 181 at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 148 at NHibernate.Engine.Cascade.CascadeCollectionElements(Object child, CollectionType collectionType, CascadeStyle style, IType elemType, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 230 at NHibernate.Engine.Cascade.CascadeCollection(Object child, CascadeStyle style, Object anything, CollectionType type) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 201 at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 185 at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 148 at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Engine\Cascade.cs:line 126 at NHibernate.Event.Default.AbstractFlushingEventListener.CascadeOnFlush(IEventSource session, IEntityPersister persister, Object key, Object anything) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 208 at NHibernate.Event.Default.AbstractFlushingEventListener.PrepareEntityFlushes(IEventSource session) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 198 at NHibernate.Event.Default.AbstractFlushingEventListener.FlushEverythingToExecutions(FlushEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\AbstractFlushingEventListener.cs:line 49 at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush(FlushEvent event) in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Event\Default\DefaultFlushEventListener.cs:line 18 at NHibernate.Impl.SessionImpl.Flush() in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Impl\SessionImpl.cs:line 1187 at NHibernate.Transaction.AdoTransaction.Commit() in C:\TFS\ExtSrc\NHibernate\NHibernate-2.0.1\src\NHibernate\Transaction\AdoTransaction.cs:line 177 at Rosen.Rotims.Common.Persistence.RosoapTransactionManager.Commit() in C:\TFS\Rotims\Build\Main\Comps\Fw\Rosen.Rotims.Common\src\Persistance\RosoapTransactionManager.cs:line 79 at Rosen.Rosoap.Persistence.RHibernatePeristance.TransactionAdvise.Invoke(IMethodInvocation invocation) in c:\TFS\Rosoap\Fw\Releases\11.1\Comps\Persistence\Rosen.Rosoap.Persistence.RHibernatePeristance\src\TransactionAdvise.cs:line 64 -- Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano
