From: <fab...@us...> - 2010-09-24 04:50:58
|
Revision: 5211 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5211&view=rev Author: fabiomaulo Date: 2010-09-24 04:50:50 +0000 (Fri, 24 Sep 2010) Log Message: ----------- Fix NH-2112 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs trunk/nhibernate/src/NHibernate/Type/MapType.cs trunk/nhibernate/src/NHibernate.Test/App.config trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs Modified: trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate/Type/GenericMapType.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -79,6 +79,14 @@ result[key] = value; } + var originalPc = original as IPersistentCollection; + var resultPc = result as IPersistentCollection; + if (originalPc != null && resultPc != null) + { + if (!originalPc.IsDirty) + resultPc.ClearDirty(); + } + return result; } Modified: trunk/nhibernate/src/NHibernate/Type/MapType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/MapType.cs 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate/Type/MapType.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -89,6 +89,14 @@ result[key] = value; } + var originalPc = original as IPersistentCollection; + var resultPc = result as IPersistentCollection; + if (originalPc != null && resultPc != null) + { + if (!originalPc.IsDirty) + resultPc.ClearDirty(); + } + return result; } Modified: trunk/nhibernate/src/NHibernate.Test/App.config =================================================================== --- trunk/nhibernate/src/NHibernate.Test/App.config 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate.Test/App.config 2010-09-24 04:50:50 UTC (rev 5211) @@ -126,7 +126,7 @@ </logger> <logger name="NHibernate.SQL"> - <level value="OFF" /> + <level value="DEBUG" /> </logger> <logger name="NHibernate.AdoNet.AbstractBatcher"> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Fixture.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,78 @@ +using NUnit.Framework; +using NHibernate.Cfg; + +namespace NHibernate.Test.NHSpecificTest.NH2112 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.GenerateStatistics, "true"); + configuration.SetProperty(Environment.BatchSize, "0"); + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + s.CreateSQLQuery("DELETE FROM AMapB").ExecuteUpdate(); + s.CreateSQLQuery("DELETE FROM TableA").ExecuteUpdate(); + s.CreateSQLQuery("DELETE FROM TableB").ExecuteUpdate(); + tx.Commit(); + } + } + + [Test] + public void Test() + { + A a; + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + a = new A(); + a.Name = "A"; + B b1 = new B{ Name = "B1"}; + s.Save(b1); + B b2 = new B{ Name = "B2"}; + s.Save(b2); + a.Map.Add(b1 , "B1Text"); + a.Map.Add(b2, "B2Text"); + s.Save(a); + s.Flush(); + tx.Commit(); + } + ClearCounts(); + using (ISession s = OpenSession()) + using (ITransaction tx = s.BeginTransaction()) + { + A aCopy = (A)s.Merge(a); + s.Flush(); + tx.Commit(); + } + AssertUpdateCount(0); + AssertInsertCount(0); + } + protected void ClearCounts() + { + sessions.Statistics.Clear(); + } + + protected void AssertInsertCount(long expected) + { + Assert.That(sessions.Statistics.EntityInsertCount, Is.EqualTo(expected), "unexpected insert count"); + } + + protected void AssertUpdateCount(int expected) + { + Assert.That(sessions.Statistics.EntityUpdateCount, Is.EqualTo(expected), "unexpected update count"); + } + + protected void AssertDeleteCount(int expected) + { + Assert.That(sessions.Statistics.EntityDeleteCount, Is.EqualTo(expected), "unexpected delete count"); + } + + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Mappings.hbm.xml 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,25 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + namespace="NHibernate.Test.NHSpecificTest.NH2112" + assembly="NHibernate.Test"> + + <class name="A" table="TableA"> + <id name="Id"> + <generator class="native"/> + </id> + <version name="Version" column="Version"/> + <property name="Name"/> + <map name="Map" table ="AMapB" cascade="all-delete-orphan" lazy="true"> + <key column="AId"/> + <index-many-to-many class="B" column="BId"/> + <element column="Text" type="System.String"/> + </map> + </class> + + <class name="B" table="TableB"> + <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/NH2112/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2112/Model.cs 2010-09-24 04:50:50 UTC (rev 5211) @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.NH2112 +{ + [Serializable] + public abstract class BaseEntity<TEntity, TKey> : IEquatable<TEntity> + where TEntity : BaseEntity<TEntity, TKey> + where TKey : struct + { + public virtual TKey? Id { get; set; } + + public virtual bool Equals(TEntity other) + { + if (other == null) return false; + if (object.ReferenceEquals(this, other)) return true; + if (Id != null && other.Id == null) return false; + if (Id == null && other.Id != null) return false; + if (Id == null && other.Id == null) + return object.ReferenceEquals(this, other); + else + return Id.Value.Equals(other.Id.Value); + } + public override bool Equals(object obj) + { + + return this.Equals(obj as TEntity); + } + private int? mHashCode; + public override int GetHashCode() + { + if (mHashCode == null) // le hashcode retourné doit être le meme tout le long de la vie de l'objet + { + if (this.Id != null) + mHashCode = this.Id.GetHashCode(); + else mHashCode = base.GetHashCode(); + } + return mHashCode.Value; + } + public virtual bool IsNew + { + get + { + return (Id == null); + } + } + } + + public class A : BaseEntity<A, int> + { + public A() + { + Map = new Dictionary<B, string>(); + } + + private int version; + public virtual int Version + { + get { return version; } + set { version = value; } + } + + public virtual string Name { get; set; } + public virtual IDictionary<B, string> Map { get; set; } + + } + + public class B : BaseEntity<B, int> + { + public virtual string Name { get; set; } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 03:01:49 UTC (rev 5210) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-24 04:50:50 UTC (rev 5211) @@ -467,6 +467,8 @@ <Compile Include="NHSpecificTest\NH1836\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2111\A.cs" /> <Compile Include="NHSpecificTest\NH2111\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2112\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2112\Model.cs" /> <Compile Include="NHSpecificTest\NH2138\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2147\DefaultBatchSize.cs" /> <Compile Include="NHSpecificTest\NH2148\BugFixture.cs" /> @@ -2293,6 +2295,7 @@ <EmbeddedResource Include="CollectionTest\NullableValueTypeElementMapFixture.hbm.xml" /> <EmbeddedResource Include="DriverTest\EntityForMs2008.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2112\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2147\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2138\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2288\AclassWithDefault.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |