我在optaplanner上的项目练习,我正在尝试在我的实体上添加等价和哈希码。首先,我添加了等价方法,它运行良好!之后,我添加了哈希代码,事情出了问题。
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
} else if (o instanceof CloudBus) {
CloudBus otherBus = (CloudBus) o;
return (capacity == otherBus.getCapacity());
} else {
return false;
}
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(capacity)
.toHashCode();
}
错误:严重:servlet.service((用于servlet [webapp]的上下文[/webapp]抛出异常[在com.webapp.jersey中对规则" cundingStartbustoosmall"的异常后果:。。。。。。
我认为您需要在Cloudbus的equals()
和hashCode()
中包含另一个属性,这将在两个具有相同容量的不同云库之间有所不同。一个好的候选人是公共汽车的ID。由于ID是唯一的,因此在equals()
和hashCode()
中包含其他属性并不多(无论其容量相同等,两个不同的总线总是不平等的(。
仅根据容量进行比较的问题是,两个不同的总线可以相等(并且具有相同的哈希码(。结果,您将拥有两个不同的约束匹配,因此无法将后者添加到ConstraintMatchTotal
的constraintMatchSet
中,因为"相等"约束匹配已经存在。请参阅CondmaintaintMatchTotal。从异常消息给出更好的格式时,这是显而易见的:
ERROR: SEVERE: Servlet.service() for servlet [WebApp] in context with path [/WebApp] threw exception [
Exception executing consequence for rule "conflictingStartBusTooSmall" in com.webapp.jersey: java.lang.IllegalStateException:
The constraintMatchTotal (com.webapp.jersey/conflictingStartBusTooSmall=-97hard/0medium/0soft)
could not add constraintMatch (com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-17]=-1hard/0medium/0soft)
to its constraintMatchSet ([
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83555, CloudBus-3]=-22hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83580, CloudBus-3]=-4hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83594, CloudBus-3]=-8hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83753, CloudBus-3]=-1hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83479, CloudBus-4]=-6hard/0medium/0soft,
--> com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83435, CloudBus-6]=-1hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83429, CloudBus-8]=-26hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83610, CloudBus-8]=-17hard/0medium/0soft,
com.webapp.jersey/conflictingStartBusTooSmall/[CloudRoute-83403, CloudBus-10]=-11hard/0medium/0soft
]).
] with root cause
假设所有总线具有相同的容量,突出显示的约束匹配与将插入的约束匹配具有相同的哈希码,因为两者都具有相同的cloudroute和具有相同容量的总线。