|
From: <fab...@us...> - 2010-12-12 16:22:57
|
Revision: 5310
http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5310&view=rev
Author: fabiomaulo
Date: 2010-12-12 15:31:41 +0000 (Sun, 12 Dec 2010)
Log Message:
-----------
Fix NH-2228
Modified Paths:
--------------
trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs
trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
Added Paths:
-----------
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Domain.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Fixture.cs
trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Mappings.hbm.xml
Modified: trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs
===================================================================
--- trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-12-12 13:18:26 UTC (rev 5309)
+++ trunk/nhibernate/src/NHibernate/Persister/Entity/AbstractEntityPersister.cs 2010-12-12 15:31:41 UTC (rev 5310)
@@ -2772,6 +2772,15 @@
return Check(session.Batcher.ExecuteNonQuery(statement), id, j, expectation, statement);
}
}
+ catch (StaleStateException e)
+ {
+ if (useBatch)
+ {
+ session.Batcher.AbortBatch(e);
+ }
+
+ throw new StaleObjectStateException(EntityName, id);
+ }
catch (Exception e)
{
if (useBatch)
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Domain.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Domain.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Domain.cs 2010-12-12 15:31:41 UTC (rev 5310)
@@ -0,0 +1,20 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.NH2228
+{
+ public class Parent
+ {
+ public Parent()
+ {
+ Children = new List<Child>();
+ }
+ public virtual int Id { get; set; }
+ public virtual IList<Child> Children { get; set; }
+ }
+ public class Child
+ {
+ public virtual int Id { get; set; }
+ public virtual Parent Parent { get; set; }
+ public virtual string Description { get; set; }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Fixture.cs
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Fixture.cs (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Fixture.cs 2010-12-12 15:31:41 UTC (rev 5310)
@@ -0,0 +1,81 @@
+using System;
+using NUnit.Framework;
+using NHibernate.Cfg.Loquacious;
+using SharpTestsEx;
+
+namespace NHibernate.Test.NHSpecificTest.NH2228
+{
+ public class Fixture : BugTestCase
+ {
+ public class ParentWithTwoChildrenScenario : IDisposable
+ {
+ private readonly ISessionFactory factory;
+ private readonly int parentId;
+
+ public ParentWithTwoChildrenScenario(ISessionFactory factory)
+ {
+ this.factory = factory;
+ var parent = new Parent();
+ parent.Children.Add(new Child {Description = "Child1", Parent = parent});
+ parent.Children.Add(new Child { Description = "Child2", Parent = parent });
+ using (var s = factory.OpenSession())
+ {
+ parentId = (int)s.Save(parent);
+ s.Flush();
+ }
+ }
+
+ public int ParentId
+ {
+ get { return parentId; }
+ }
+
+ public void Dispose()
+ {
+ using (var s = factory.OpenSession())
+ {
+ s.Delete("from Parent");
+ s.Flush();
+ }
+ }
+ }
+
+ protected override void Configure(NHibernate.Cfg.Configuration configuration)
+ {
+ // needed to be sure of StaleStateException that the user has reported in the issue
+ configuration.DataBaseIntegration(x => x.BatchSize = 1);
+ }
+
+ [Test]
+ public void WhenStaleObjectStateThenMessageContainsEntity()
+ {
+ using (var scenario = new ParentWithTwoChildrenScenario(Sfi))
+ {
+ using (var client1 = OpenSession())
+ using (var tx1 = client1.BeginTransaction())
+ {
+ var parentFromClient1 = client1.Get<Parent>(scenario.ParentId);
+ NHibernateUtil.Initialize(parentFromClient1.Children);
+ var firstChildId = parentFromClient1.Children[0].Id;
+
+ DeleteChildUsingAnotherSession(firstChildId);
+
+ parentFromClient1.Children[0].Description = "Modified info";
+ var expectedException = tx1.Executing(x => x.Commit()).Throws<StaleObjectStateException>().Exception;
+ expectedException.EntityName.Should().Be(typeof(Child).FullName);
+ expectedException.Identifier.Should().Be(firstChildId);
+ }
+ }
+ }
+
+ private void DeleteChildUsingAnotherSession(int childIdToDelete)
+ {
+ using (var client2 = Sfi.OpenStatelessSession())
+ using (var tx2 = client2.BeginTransaction())
+ {
+ client2.CreateQuery("delete from Child c where c.Id = :pChildId").SetInt32("pChildId", childIdToDelete).ExecuteUpdate();
+ tx2.Commit();
+ }
+ }
+ }
+}
\ No newline at end of file
Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Mappings.hbm.xml
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Mappings.hbm.xml (rev 0)
+++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2228/Mappings.hbm.xml 2010-12-12 15:31:41 UTC (rev 5310)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
+ assembly="NHibernate.Test"
+ namespace="NHibernate.Test.NHSpecificTest.NH2228">
+
+ <class name="Parent" >
+ <id name="Id">
+ <generator class="hilo" />
+ </id>
+ <bag name="Children" inverse="true" cascade="all,delete-orphan">
+ <key column="ParentId" />
+ <one-to-many class="Child"/>
+ </bag>
+ </class>
+ <class name="Child" >
+ <id name="Id">
+ <generator class="hilo" />
+ </id>
+ <many-to-one name="Parent" column="ParentId"/>
+ <property name="Description"/>
+ </class>
+
+</hibernate-mapping>
Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj
===================================================================
--- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-12 13:18:26 UTC (rev 5309)
+++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-12-12 15:31:41 UTC (rev 5310)
@@ -474,6 +474,8 @@
<Compile Include="NHSpecificTest\NH2202\Model.cs" />
<Compile Include="NHSpecificTest\NH2224\Domain.cs" />
<Compile Include="NHSpecificTest\NH2224\Fixture.cs" />
+ <Compile Include="NHSpecificTest\NH2228\Domain.cs" />
+ <Compile Include="NHSpecificTest\NH2228\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2244\A.cs" />
<Compile Include="NHSpecificTest\NH2244\Fixture.cs" />
<Compile Include="NHSpecificTest\NH2244\PhoneNumber.cs" />
@@ -2356,6 +2358,7 @@
<EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" />
<EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" />
<Content Include="DynamicEntity\package.html" />
+ <EmbeddedResource Include="NHSpecificTest\NH2228\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2386\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\Properties\Mappings.hbm.xml" />
<EmbeddedResource Include="NHSpecificTest\NH2378\Mappings.hbm.xml" />
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|