You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ibatis.apache.org by "Gilles Bayon (JIRA)" <ib...@incubator.apache.org> on 2005/12/05 20:30:09 UTC
[jira] Resolved: (IBATISNET-118) CacheKey.Equals(object) override can return true when the parameters have the same HashCode but are not equal.
[ 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