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

Responder a