|
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.
|