|
From: <fab...@us...> - 2008-11-08 21:21:02
|
Revision: 3902
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=3902&view=rev
Author: fabiomaulo
Date: 2008-11-08 21:20:57 +0000 (Sat, 08 Nov 2008)
Log Message:
-----------
Improv: ignore transient entities when on session.Refresh
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs
trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs
Modified: trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2008-11-08 17:07:55 UTC (rev 3901)
+++ trunk/nhibernate/src/NHibernate/Event/Default/DefaultRefreshEventListener.cs 2008-11-08 21:20:57 UTC (rev 3902)
@@ -97,8 +97,10 @@
source.FetchProfile = "refresh";
object result = persister.Load(id, obj, @event.LockMode, source);
source.FetchProfile = previousFetchProfile;
-
- UnresolvableObjectException.ThrowIfNull(result, id, persister.EntityName);
+ // NH Different behavior : we are ignoring transient entities without throw any kind of exception
+ // because a transient entity is "self refreshed"
+ if (!ForeignKeys.IsTransient(persister.EntityName, obj, result == null, @event.Session))
+ UnresolvableObjectException.ThrowIfNull(result, id, persister.EntityName);
}
// Evict collections from the factory-level cache
Modified: trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs 2008-11-08 17:07:55 UTC (rev 3901)
+++ trunk/nhibernate/src/NHibernate.Test/Cascade/RefreshFixture.cs 2008-11-08 21:20:57 UTC (rev 3902)
@@ -16,7 +16,7 @@
protected override IList Mappings
{
- get { return new string[] { "Cascade.Job.hbm.xml", "Cascade.JobBatch.hbm.xml" }; }
+ get { return new[] { "Cascade.Job.hbm.xml", "Cascade.JobBatch.hbm.xml" }; }
}
[Test]
@@ -57,5 +57,58 @@
session.Transaction.Enlist(cmd);
cmd.ExecuteNonQuery();
}
+
+ [Test]
+ public void RefreshIgnoringTransient()
+ {
+ // No exception expected
+ ISession session = OpenSession();
+ ITransaction txn = session.BeginTransaction();
+
+ var batch = new JobBatch(DateTime.Now);
+ session.Refresh(batch);
+
+ txn.Rollback();
+ session.Close();
+ }
+
+ [Test]
+ public void RefreshIgnoringTransientInCollection()
+ {
+ ISession session = OpenSession();
+ ITransaction txn = session.BeginTransaction();
+
+ var batch = new JobBatch(DateTime.Now);
+ batch.CreateJob().ProcessingInstructions = "Just do it!";
+ session.Persist(batch);
+ session.Flush();
+
+ batch.CreateJob().ProcessingInstructions = "I know you can do it!";
+ session.Refresh(batch);
+ Assert.That(batch.Jobs.Count == 1);
+
+ txn.Rollback();
+ session.Close();
+ }
+
+ [Test]
+ public void RefreshNotIgnoringTransientByUnsavedValue()
+ {
+ ISession session = OpenSession();
+ ITransaction txn = session.BeginTransaction();
+
+ var batch = new JobBatch { BatchDate = DateTime.Now, Id = 1 };
+ try
+ {
+ session.Refresh(batch);
+ }
+ catch (UnresolvableObjectException)
+ {
+ // as expected
+ txn.Rollback();
+ session.Close();
+ }
+ }
+
}
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|