From: <aye...@us...> - 2010-03-03 15:54:42
|
Revision: 4951 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4951&view=rev Author: ayenderahien Date: 2010-03-03 15:54:34 +0000 (Wed, 03 Mar 2010) Log Message: ----------- Fixing NH-2113 Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Type/ComponentType.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Model.cs Modified: trunk/nhibernate/src/NHibernate/Type/ComponentType.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Type/ComponentType.cs 2010-03-02 20:55:46 UTC (rev 4950) +++ trunk/nhibernate/src/NHibernate/Type/ComponentType.cs 2010-03-03 15:54:34 UTC (rev 4951) @@ -23,8 +23,9 @@ private readonly FetchMode?[] joinedFetch; private readonly bool isKey; protected internal EntityModeToTuplizerMapping tuplizerMapping; + private bool overridesGetHashCode; - public override SqlType[] SqlTypes(IMapping mapping) + public override SqlType[] SqlTypes(IMapping mapping) { //Not called at runtime so doesn't matter if its slow :) SqlType[] sqlTypes = new SqlType[GetColumnSpan(mapping)]; @@ -72,6 +73,11 @@ } tuplizerMapping = metamodel.TuplizerMapping; + var tuplizer = tuplizerMapping.GetTuplizerOrNull(EntityMode.Poco); + if(tuplizer !=null) + { + overridesGetHashCode = ReflectHelper.OverridesGetHashCode(tuplizer.MappedClass); + } } /// <summary></summary> @@ -100,6 +106,8 @@ public override int GetHashCode(object x, EntityMode entityMode, ISessionFactoryImplementor factory) { + if (overridesGetHashCode) + return x.GetHashCode(); return GetHashCode(x, entityMode); } Property changes on: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113 ___________________________________________________________________ Added: bugtraq:url + http://jira.nhibernate.org/browse/%BUGID% Added: bugtraq:logregex + NH-\d+ Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Fixture.cs 2010-03-03 15:54:34 UTC (rev 4951) @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Transactions; +using NHibernate.Dialect; +using NHibernate.Impl; +using NUnit.Framework; +using NHibernate.Criterion; + +namespace NHibernate.Test.NHSpecificTest.NH2113 +{ + [TestFixture] + public class Fixture : BugTestCase + { + + [Test] + public void ShouldNotEagerLoadKeyManyToOneWhenOverridingGetHashCode() + { + using (var s = OpenSession()) + using(var tx = s.BeginTransaction()) + { + var grp = new Group(); + s.Save(grp); + + var broker = new Broker{Key = new Key{BankId = 1, Id = -1}}; + s.Save(broker); + + var load = new Loan {Broker = broker, Group = grp, Name = "money!!!"}; + s.Save(load); + + tx.Commit(); + } + + bool isInitialized; + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + var loan = s.CreateCriteria<Loan>() + .UniqueResult<Loan>(); + + isInitialized = NHibernateUtil.IsInitialized(loan.Broker); + + tx.Commit(); + } + + + using (var s = OpenSession()) + using (var tx = s.BeginTransaction()) + { + s.Delete("from System.Object"); + + tx.Commit(); + } + + Assert.False(isInitialized); + } + } +} Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Mappings.hbm.xml 2010-03-03 15:54:34 UTC (rev 4951) @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2113"> + + <class name="Loan"> + <composite-id> + <key-many-to-one name="Broker" class="Broker"> + <column name="BrokerID"/> + <column name="BankID"/> + </key-many-to-one> + <key-many-to-one name="Group" + column="GroupID" class="Group"/> + </composite-id> + <property name="Name" /> + </class> + + <class name="Group" table="Groups"> + <id name="Id" column="GroupID"> + <generator class="increment"/> + </id> + </class> + + <class name="Broker"> + <composite-id name="Key"> + <key-property name="Id" + column="BrokerID"/> + <key-property name="BankId"/> + </composite-id> + </class> + +</hibernate-mapping> Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2113/Model.cs 2010-03-03 15:54:34 UTC (rev 4951) @@ -0,0 +1,89 @@ +namespace NHibernate.Test.NHSpecificTest.NH2113 +{ + public class Loan + { + public virtual Broker Broker{ get; set;} + public virtual Group Group { get; set; } + public virtual string Name { get; set; } + + public virtual bool Equals(Loan other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.Broker, Broker) && Equals(other.Group, Group); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Loan)) return false; + return Equals((Loan) obj); + } + + public override int GetHashCode() + { + unchecked + { + return ((Broker != null ? Broker.Key.GetHashCode() : 0)*397) ^ (Group != null ? Group.GetHashCode() : 0); + } + } + } + + public class Group + { + public virtual int Id { get; set; } + } + public class Broker + { + public virtual Key Key { get; set; } + + public virtual bool Equals(Broker other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Equals(other.Key, Key); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Broker)) return false; + return Equals((Broker) obj); + } + + public override int GetHashCode() + { + return (Key != null ? Key.GetHashCode() : 0); + } + } + public class Key + { + public int Id { get; set; } + public int BankId { get; set; } + + public virtual bool Equals(Key other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return other.Id == Id && other.BankId == BankId; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != typeof (Key)) return false; + return Equals((Key) obj); + } + + public override int GetHashCode() + { + unchecked + { + return (Id*397) ^ BankId; + } + } + } +} Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-03-02 20:55:46 UTC (rev 4950) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-03-03 15:54:34 UTC (rev 4951) @@ -707,6 +707,8 @@ <Compile Include="NHSpecificTest\NH2074\Model.cs" /> <Compile Include="NHSpecificTest\NH2077\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2077\Model.cs" /> + <Compile Include="NHSpecificTest\NH2113\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2113\Model.cs" /> <Compile Include="NHSpecificTest\NH473\Child.cs" /> <Compile Include="NHSpecificTest\NH473\Fixture.cs" /> <Compile Include="NHSpecificTest\NH473\Parent.cs" /> @@ -2124,6 +2126,7 @@ <EmbeddedResource Include="CfgTest\Loquacious\EntityToCache.hbm.xml" /> <EmbeddedResource Include="DriverTest\SqlServerCeEntity.hbm.xml" /> <Content Include="DynamicEntity\package.html" /> + <EmbeddedResource Include="NHSpecificTest\NH2113\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH1981\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2074\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2077\Mappings.hbm.xml" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |