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