DATACMNS-511 - Improve equals(…) and hashCode() in TypeVariableTypeInformation.

The equals(…) and hashCode() methods of TypeVariableTypeInformation previously tried to evaluate the unresolved context of the type variable. This can cause issues in recursive type definitions as set up in the according test case. We now implement the methods based on the resolved type to makes sure we break the recursive lookup of PersistentEntity instances in AbstractMappingContext. 

The erroneous lookup was actually caused by unresolved base types being added to the mapping context within the JPA project as the JPA meta-model also returns those types as managed types.

Related pull request: #84.
This commit is contained in:
Oliver Gierke
2014-05-28 15:06:06 +02:00
parent 58fa6c350b
commit fd4121e03e
2 changed files with 85 additions and 17 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2011 the original author or authors.
* Copyright 2011-2014 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -55,8 +55,7 @@ class TypeVariableTypeInformation<T> extends ParentTypeAwareTypeInformation<T> {
/*
* (non-Javadoc)
*
* @see org.springframework.data.document.mongodb.TypeDiscovererTest.TypeDiscoverer#getType()
* @see org.springframework.data.util.TypeDiscoverer#getType()
*/
@Override
public Class<T> getType() {
@@ -92,38 +91,40 @@ class TypeVariableTypeInformation<T> extends ParentTypeAwareTypeInformation<T> {
}
/*
* (non-Javadoc)
*
* @see org.springframework.data.util.TypeDiscoverer#equals(java.lang.Object)
*/
* (non-Javadoc)
* @see org.springframework.data.util.ParentTypeAwareTypeInformation#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if (!super.equals(obj)) {
if (obj == this) {
return true;
}
if (!(obj instanceof TypeVariableTypeInformation)) {
return false;
}
TypeVariableTypeInformation<?> that = (TypeVariableTypeInformation<?>) obj;
return nullSafeEquals(this.owningType, that.owningType) && nullSafeEquals(this.variable, that.variable);
return getType().equals(that.getType());
}
/*
* (non-Javadoc)
*
* @see org.springframework.data.util.TypeDiscoverer#hashCode()
*/
* (non-Javadoc)
* @see org.springframework.data.util.ParentTypeAwareTypeInformation#hashCode()
*/
@Override
public int hashCode() {
int result = super.hashCode();
int result = 17;
result += 31 * nullSafeHashCode(this.owningType);
result += 31 * nullSafeHashCode(this.variable);
result += 31 * nullSafeHashCode(getType());
return result;
}
/*
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/