|
From: <jul...@us...> - 2010-09-13 16:31:53
|
Revision: 5183
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5183&view=rev
Author: julian-maughan
Date: 2010-09-13 16:31:46 +0000 (Mon, 13 Sep 2010)
Log Message:
-----------
Fixed bug where an IPostUpdateEventListener.OnPostUpdate event causes an enumeration error in ActionQueue.ExecuteActions. In the event, an ExecuteUpdate criteria statement causes a flush to occur during a flush already initiated by transaction commit. This results in an earlier-than-expected call to ActionQueue.ClearFromFlushNeededCheck, resetting its list of updates before it has finished iterating them (ref. NH-2322). Thanks Filip Zawada for the solution.
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs
Modified: trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-12 00:40:28 UTC (rev 5182)
+++ trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-13 16:31:46 UTC (rev 5183)
@@ -109,8 +109,9 @@
private void ExecuteActions(IList list)
{
- foreach (IExecutable executable in list)
- Execute(executable);
+ int size = list.Count;
+ for (int i = 0; i < size; i++)
+ Execute((IExecutable)list[i]);
list.Clear();
session.Batcher.ExecuteBatch();
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs 2010-09-13 16:31:46 UTC (rev 5183)
@@ -0,0 +1,51 @@
+using NHibernate.Cfg;
+using NUnit.Framework;
+using NHibernate.Event;
+using System.Diagnostics;
+
+namespace NHibernate.Test.NHSpecificTest.NH2322
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ protected override void Configure(Configuration configuration)
+ {
+ configuration.SetProperty(Environment.FormatSql, "false");
+ configuration.SetListener(ListenerType.PostUpdate, new PostUpdateEventListener());
+ }
+
+ protected override void OnTearDown()
+ {
+ using (ISession s = OpenSession())
+ {
+ s.Delete("from Person");
+ s.Flush();
+ }
+ base.OnTearDown();
+ }
+
+ [Test]
+ public void ShouldNotThrowWhenCommitingATransaction()
+ {
+ int id;
+
+ using (ISession s = OpenSession())
+ using (ITransaction t = s.BeginTransaction())
+ {
+ var p = new Person { Name = "inserted name" };
+ s.Save(p);
+ id = p.Id;
+ t.Commit();
+ }
+
+ using (ISession s = OpenSession())
+ using (ITransaction t = s.BeginTransaction())
+ {
+ var p = s.Get<Person>(id);
+ p.Name = "changing the name...";
+
+ Assert.That(delegate() { t.Commit(); }, Throws.Nothing);
+ }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml 2010-09-13 16:31:46 UTC (rev 5183)
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping
+ xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.NHSpecificTest.NH2322">
+
+ <class name="Person">
+ <id name="Id">
+ <generator class="native" />
+ </id>
+ <property name="Name"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs 2010-09-13 16:31:46 UTC (rev 5183)
@@ -0,0 +1,8 @@
+namespace NHibernate.Test.NHSpecificTest.NH2322
+{
+ public class Person
+ {
+ public virtual int Id { get; set; }
+ public virtual string Name { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs 2010-09-13 16:31:46 UTC (rev 5183)
@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using NHibernate.Event;
+
+namespace NHibernate.Test.NHSpecificTest.NH2322
+{
+ public class PostUpdateEventListener : IPostUpdateEventListener
+ {
+ void IPostUpdateEventListener.OnPostUpdate(PostUpdateEvent @event)
+ {
+ if (@event.Entity is Person)
+ {
+ @event.Session
+ .CreateSQLQuery("update Person set Name = :newName")
+ .SetString("newName", "new updated name")
+ .ExecuteUpdate();
+ }
+ }
+ }
+}
\ No newline at end of file
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-12 00:40:28 UTC (rev 5182)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-13 16:31:46 UTC (rev 5183)
@@ -477,6 +477,9 @@
<Compile Include="NHSpecificTest\NH2302\StringLengthEntity.cs" />
<Compile Include="NHSpecificTest\NH2303\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2303\Model.cs" />
+ <Compile Include="NHSpecificTest\NH2322\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2322\Model.cs" />
+ <Compile Include="NHSpecificTest\NH2322\PostUpdateEventListener.cs" />
<Compile Include="TypesTest\CharClass.cs" />
<Compile Include="TypesTest\CharClassFixture.cs" />
<Compile Include="TypesTest\DateTimeClass.cs" />
@@ -1755,6 +1758,7 @@
<EmbeddedResource Include="NHSpecificTest\NH2224\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2279\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2111\Mappings.hbm.xml" />
+ <EmbeddedResource Include="NHSpecificTest\NH2322\Mappings.hbm.xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj">
@@ -2601,6 +2605,7 @@
<ItemGroup>
<Folder Include="NHSpecificTest\NH2111" />
<Folder Include="NHSpecificTest\NH2279" />
+ <Folder Include="NHSpecificTest\NH2322" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|