From: <fab...@us...> - 2008-08-16 05:03:48
|
Revision: 3708 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3708&view=rev Author: fabiomaulo Date: 2008-08-16 05:03:56 +0000 (Sat, 16 Aug 2008) Log Message: ----------- Complete the port of tests for <natural-id> with bug fix and "todo" done. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs Modified: trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2008-08-16 04:11:17 UTC (rev 3707) +++ trunk/nhibernate/src/NHibernate/Engine/StatefulPersistenceContext.cs 2008-08-16 05:03:56 UTC (rev 3708) @@ -356,48 +356,46 @@ /// </summary> public object[] GetNaturalIdSnapshot(object id, IEntityPersister persister) { - // todo Natural Identifier - //if (!persister.HasNaturalIdentifier) - //{ - // return null; - //} + if (!persister.HasNaturalIdentifier) + { + return null; + } - //// if the natural-id is marked as non-mutable, it is not retrieved during a - //// normal database-snapshot operation... - //int[] props = persister.NaturalIdentifierProperties; - //bool[] updateable = persister.PropertyUpdateability; - //bool allNatualIdPropsAreUpdateable = true; - //for (int i = 0; i < props.Length; i++) - //{ - // if (!updateable[props[i]]) - // { - // allNatualIdPropsAreUpdateable = false; - // break; - // } - //} + // if the natural-id is marked as non-mutable, it is not retrieved during a + // normal database-snapshot operation... + int[] props = persister.NaturalIdentifierProperties; + bool[] updateable = persister.PropertyUpdateability; + bool allNatualIdPropsAreUpdateable = true; + for (int i = 0; i < props.Length; i++) + { + if (!updateable[props[i]]) + { + allNatualIdPropsAreUpdateable = false; + break; + } + } - //if (allNatualIdPropsAreUpdateable) - //{ - // // do this when all the properties are updateable since there is - // // a certain likelihood that the information will already be - // // snapshot-cached. - // object[] entitySnapshot = GetDatabaseSnapshot(id, persister); - // if (entitySnapshot == NoRow) - // { - // return null; - // } - // object[] naturalIdSnapshot = new object[props.Length]; - // for (int i = 0; i < props.Length; i++) - // { - // naturalIdSnapshot[i] = entitySnapshot[props[i]]; - // } - // return naturalIdSnapshot; - //} - //else - //{ - // return persister.GetNaturalIdentifierSnapshot(id, session); - //} - return null; + if (allNatualIdPropsAreUpdateable) + { + // do this when all the properties are updateable since there is + // a certain likelihood that the information will already be + // snapshot-cached. + object[] entitySnapshot = GetDatabaseSnapshot(id, persister); + if (entitySnapshot == NoRow) + { + return null; + } + object[] naturalIdSnapshot = new object[props.Length]; + for (int i = 0; i < props.Length; i++) + { + naturalIdSnapshot[i] = entitySnapshot[props[i]]; + } + return naturalIdSnapshot; + } + else + { + return persister.GetNaturalIdentifierSnapshot(id, session); + } } /// <summary> Add a canonical mapping from entity key to entity instance</summary> Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2008-08-16 04:11:17 UTC (rev 3707) +++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultFlushEntityEventListener.cs 2008-08-16 05:03:56 UTC (rev 3708) @@ -122,10 +122,7 @@ { if (persister.HasNaturalIdentifier && entry.Status != Status.ReadOnly) { - if (loaded == null) - { - loaded = session.PersistenceContext.GetNaturalIdSnapshot(entry.Id, persister); - } + object[] snapshot = null; IType[] types = persister.PropertyTypes; int[] props = persister.NaturalIdentifierProperties; bool[] updateable = persister.PropertyUpdateability; @@ -134,10 +131,24 @@ int prop = props[i]; if (!updateable[prop]) { - if (!types[prop].IsEqual(current[prop], loaded[prop], entityMode)) + object loadedVal; + if (loaded == null) { - throw new HibernateException("immutable natural identifier of an instance of " + persister.EntityName + " was altered"); + if (snapshot == null) + { + snapshot = session.PersistenceContext.GetNaturalIdSnapshot(entry.Id, persister); + } + loadedVal = snapshot[i]; } + else + { + loadedVal = loaded[prop]; + } + if (!types[prop].IsEqual(current[prop], loadedVal, entityMode)) + { + throw new HibernateException("immutable natural identifier of an instance of " + persister.EntityName + + " was altered"); + } } } } Modified: trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs 2008-08-16 04:11:17 UTC (rev 3707) +++ trunk/nhibernate/src/NHibernate.Test/Naturalid/Mutable/MutableNaturalIdFixture.cs 2008-08-16 05:03:56 UTC (rev 3708) @@ -12,7 +12,6 @@ [TestFixture] public class MutableNaturalIdFixture : TestCase { - // TODO : Complete the test as H3.2.6 protected override string MappingsAssembly { get { return "NHibernate.Test"; } @@ -56,12 +55,7 @@ } catch (Exception) { - try - { s.Transaction.Rollback(); - } - catch (Exception) {} - throw; } finally { @@ -84,10 +78,8 @@ ITransaction t = s.BeginTransaction(); object nullUser = - s.CreateCriteria(typeof (User)) - .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) - .SetCacheable(true) - .UniqueResult(); + s.CreateCriteria(typeof (User)).Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")).SetCacheable( + true).UniqueResult(); Assert.That(nullUser, Is.Null); @@ -112,9 +104,10 @@ s = OpenSession(); t = s.BeginTransaction(); - u =(User) s.CreateCriteria(typeof (User)) - .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) - .SetCacheable(true).UniqueResult(); + u = + (User) + s.CreateCriteria(typeof (User)).Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")).SetCacheable( + true).UniqueResult(); Assert.That(u, Is.Not.Null); @@ -130,9 +123,10 @@ s = OpenSession(); t = s.BeginTransaction(); - u =(User) s.CreateCriteria(typeof (User)) - .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) - .SetCacheable(true).UniqueResult(); + u = + (User) + s.CreateCriteria(typeof (User)).Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")).SetCacheable( + true).UniqueResult(); s.Delete(u); @@ -147,9 +141,9 @@ s = OpenSession(); t = s.BeginTransaction(); - nullUser = s.CreateCriteria(typeof (User)) - .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) - .SetCacheable(true).UniqueResult(); + nullUser = + s.CreateCriteria(typeof (User)).Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")).SetCacheable( + true).UniqueResult(); Assert.That(nullUser, Is.Null); @@ -206,16 +200,23 @@ t = s.BeginTransaction(); u = (User) s.CreateCriteria(typeof (User)) - .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) + .Add(Restrictions.NaturalId().Set("name", "xam").Set("org", "hb")) .SetCacheable(true).UniqueResult(); Assert.That(u, Is.Not.Null); + Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount); + Assert.AreEqual(0, sessions.Statistics.QueryCacheHitCount); + u = (User)s.CreateCriteria(typeof(User)) + .Add(Restrictions.NaturalId().Set("name", "gavin").Set("org", "hb")) + .SetCacheable(true).UniqueResult(); + Assert.That(u, Is.Not.Null); + Assert.AreEqual(1, sessions.Statistics.QueryExecutionCount); + Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); + t.Commit(); s.Close(); - Assert.AreEqual(0, sessions.Statistics.QueryExecutionCount); - Assert.AreEqual(1, sessions.Statistics.QueryCacheHitCount); s = OpenSession(); t = s.BeginTransaction(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |