That is my mistake, the nested objects loaded from the database is not
touched so they remains its dirty state set by AOP.

I think the simplest solution is to map a column to a field instead of a
property.

for example, a C# property:

        private string m_Name;

        public String Name
        {
            get { return m_Name; }
            set { m_Name = value; }
        }

we can map the column "Name" to the "m_Name" field rather than the "Name"
property in SqlMap:

            <result property="m_Name" column="Name" dbType="VarChar"/>

So load object from DB will not fire the dirty tracking injiected by AOP.

On Fri, May 29, 2009 at 9:19 PM, Sal Bass <salbass...@hotmail.com> wrote:

>
> Yaojian,
>
> Thanks! I am still confused though. When I make a call to QueryForObject
> and reset the IsLoading flag to false, that only sets it false for the root
> object. All complex property collections that are loaded at the same time
> will not be reset. Am I missing something obvious?
>
>
>
> ________________________________
> > Date: Fri, 29 May 2009 03:52:58 +0800
> > Subject: Re: Dirty Tracking Issue
> > From: sky...@gmail.com
> > To: user-cs@ibatis.apache.org
> >
> > If the non-root object is loaded from the database, it should be created
> with the new object factory.
> > otherwise, it is irrelavant with 'dirty'.
> >
> > Bellow is my code for using IObjectFactory, I use a custom IObjectFactory
> for attaching each object to a context variable.
> >
> >
> >
> > DomSqlMapBuilder builder = CreateDomSqlMapBuilder();
> >
> > //Use SqmObjectFactory for attaching objects to the current
> IObjectContext
> > IObjectFactory originalFactory = new ObjectFactory(true);
> >
> > SqmObjectFactory contextableFactory = new
> SqmObjectFactory(originalFactory);
> > builder.ObjectFactory = contextableFactory;
> >
> > ISqlMapper sqlMapper = builder.Configure(m_SqlMapDocument);
> >
> >
> >
> --------------------------------------------------------------------------------------------------------------------------------------------------
> >
> > /// Represents the factory of MDA persistent object used by IBatis.NET.
> >
> > /// attaches an
> > /// to each objects created with this factory.
> > public class SqmObjectFactory : IObjectFactory, IEntityContextBindable
> >
> > {
> > /// Creates an instance.
> > /// The original .
> > public SqmObjectFactory(IObjectFactory objectFactoryImpl)
> >
> > {
> > if (objectFactoryImpl == null) throw new
> ArgumentNullException("objectFactoryImpl");
> > m_ObjectFactoryImpl = objectFactoryImpl;
> > }
> >
> > private readonly IObjectFactory m_ObjectFactoryImpl;
> >
> >
> > private IEntityContext m_EntityContext;
> >
> > public IEntityContext EntityContext
> > {
> > get { return m_EntityContext; }
> > set { m_EntityContext = value; }
> > }
> >
> >
> > /// .
> > public IFactory CreateFactory(Type typeToCreate, Type[] types)
> > {
> > IFactory result = m_ObjectFactoryImpl.CreateFactory(typeToCreate, types);
> >
> > if (typeof(IEntityContextBindable).IsAssignableFrom(typeToCreate))
> > {
> > return new SqmFactory(this, result);
> > }
> > return result;
> > }
> >
> > private class SqmFactory : IFactory
> >
> > {
> > public SqmFactory(IEntityContextBindable objectContextable, IFactory
> factory)
> > {
> > if (objectContextable == null) throw new
> ArgumentNullException("objectContextable");
> >
> > if (factory == null) throw new ArgumentNullException("factory");
> >
> > m_ObjectContextable = objectContextable;
> > m_Factory = factory;
> > }
> >
> > private readonly IEntityContextBindable m_ObjectContextable;
> >
> >
> > private readonly IFactory m_Factory;
> >
> > public object CreateInstance(object[] parameters)
> > {
> > Object result = m_Factory.CreateInstance(parameters);
> > ((IEntityContextBindable)result).EntityContext =
> m_ObjectContextable.EntityContext;
> >
> > return result;
> > }
> > }
> > }
> >
> >
> > On Fri, May 29, 2009 at 3:45 AM, Sal Bass> wrote:
> >
> >
> >
> > Yes, I explored that. But how will that work for the complex properties?
> Only the root object would know it's in a loading state.
> >
> >
> >
> >
> >
> > ________________________________
> >
> >> Date: Fri, 29 May 2009 02:22:33 +0800
> >
> >> Subject: Re: Dirty Tracking Issue
> >
> >> From: sky...@gmail.com
> >
> >> To: user-cs@ibatis.apache.org
> >
> >>
> >
> >> We can bypass to set 'dirty' if the AOP generation mechanism can know an
> object is in 'loading' state.
> >
> >>
> >
> >> We can use a custom IBatisNet.Common.Utilities.IObjectFactory to mark an
> object 'loading'.
> >
> >>
> >
> >> And we can use a wrapped ISqlMapper to clean the 'loading' flag as:
> >
> >>
> >
> >> public object QueryForObject(string statementName, object
> parameterObject) {
> >
> >> Object result = originalSqlMapper.QueryForObject(...);
> >
> >>
> >
> >> result.IsLoading = false;
> >
> >> return result;
> >
> >> }
> >
> >>
> >
> >>
> >
> >> Yaojian
> >
> >>
> >
> >> On Fri, May 29, 2009 at 1:55 AM, Sal Bass> wrote:
> >
> >>
> >
> >>
> >
> >>
> >
> >> I am having a dilema with implementing dirty tracking on my entities. I
> am using AOP to mark an entity as "dirty" when a property is set. The
> problem occurs when I load the entities using Ibatis because it sets the
> properties during mapping which makes the entity dirty (no, I can't use
> constructor mapping here). So, I use a RowDelegate to mark the entity clean
> before returning it. Works great....except for when I am loading a root
> object with several complex properties (ILists of other entities). The
> RowDelegate is obviously not fired for each complex property, so they are
> returned as dirty.
> >
> >
> >>
> >
> >>
> >
> >>
> >
> >>
> >
> >> Any idea of how I can get at all of the complex properties to mark them
> clean before returning the entity?
> >
> >>
> >
> >>
> >
> >>
> >
> >>
> >
> >>
> >
> >>
> >
> >>
> >
> >> _________________________________________________________________
> >
> >>
> >
> >> Hotmail® goes with you.
> >
> >>
> >
> >>
> http://windowslive.com/Tutorial/Hotmail/Mobile?ocid=TXT_TAGLM_WL_HM_Tutorial_Mobile1_052009
> >
> >
> >>
> >
> >>
> >
> > _________________________________________________________________
> >
> > Windows Live™: Keep your life in sync.
> >
> > http://windowslive.com/explore?ocid=TXT_TAGLM_BR_life_in_synch_052009
> >
> _________________________________________________________________
> Insert movie times and more without leaving Hotmail®.
>
> http://windowslive.com/Tutorial/Hotmail/QuickAdd?ocid=TXT_TAGLM_WL_HM_Tutorial_QuickAdd1_052009

Reply via email to