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