[ http://issues.apache.org/jira/browse/IBATISNET-118?page=all ] Gilles Bayon resolved IBATISNET-118: ------------------------------------
Resolution: Fixed In SVN > CacheKey.Equals(object) override can return true when the parameters have the > same HashCode but are not equal. > -------------------------------------------------------------------------------------------------------------- > > Key: IBATISNET-118 > URL: http://issues.apache.org/jira/browse/IBATISNET-118 > Project: iBatis for .NET > Type: Bug > Components: DataMapper > Versions: DataMapper 1.2.1 > Environment: Windows > Reporter: Thomas Tannahill > Assignee: Gilles Bayon > Fix For: DataMapper 1.3 > > CacheKey.Equals(object) override can return true when the parameters have the > same HashCode but are not equal. This can cause false cache hits. > Only an issue for complex parameters. > Failing NUnit test: > ---- UNIT TEST BEGIN ---- > using IBatisNet.DataMapper; > using IBatisNet.DataMapper.TypeHandlers; > using NUnit.Framework; > namespace IBatisNet.DataAccess > { > [TestFixture] > public class CacheKeyTests > { > private const long A_LONG = 1L; > private const long ANOTHER_LONG_WITH_SAME_HASHCODE = > -9223372034707292159; > > public CacheKeyTests() > { > } > [Test] > public void > ShouldNotBeConsideredEqualWhenParametersHaveTheSameHashCodeButAreNotEqual() > { > TypeHandlerFactory factory = new TypeHandlerFactory(); > // Two cache keys are equal except for the parameter. > CacheKey key = new CacheKey(factory, "STATEMENT", > "SQL", new TestClass(A_LONG), new string[] {"AProperty"}, 0, 0, > CacheKeyType.Object); > CacheKey aDifferentKey = new CacheKey(factory, > "STATEMENT", "SQL", new TestClass(ANOTHER_LONG_WITH_SAME_HASHCODE), new > string[] {"AProperty"}, 0, 0, CacheKeyType.Object); > Assert.IsFalse(aDifferentKey.Equals(key)); // should > not be equal. > } > } > public class TestClass > { > private long aProperty; > public TestClass(long aProperty) > { > this.aProperty = aProperty; > } > public long AProperty > { > get { return aProperty; } > set { aProperty = value; } > } > } > } > ---- UNIT TEST END ---- > The test passes if you replace this line in CacheKey.Equals(): > if (_hashCode != cacheKey._hashCode) return false; > with something like this: > if (this._parameter == null && cacheKey._parameter != null) > return false; > if (this._parameter != null && cacheKey._parameter == null) > return false; > if (!this._parameter.Equals(cacheKey._parameter)) return false; -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira