[ 
http://issues.apache.org/jira/browse/IBATISNET-118?page=comments#action_12355678
 ] 

Jeremy Gray commented on IBATISNET-118:
---------------------------------------

This is a dangerous, slippery slope.

In .NET there are two and only two equality semantics: reference and value type.

Assuming that ibatis is now also checking .Equals as opposed to its previous 
reliance on only GetHashcode, the responsibility falls on the creator of the 
class being checked for equality, not on ibatis, to perform the appropriate 
comparison.

Reference types that wish to use a value-type equality semantic must implement 
the appropriate method overrides themselves (as System.String does, for 
example).

Ibatis must in turn use only .GetHashcode() and .Equals(...).

Any other expected behaviour indicates that the class being compared has 
implemented the wrong equality semantic.

> 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

Reply via email to