在自定义克隆期间从未将实体添加到此 scoreDirector 异常

The entity was never added to this scoreDirector exception during custom cloning

我正在尝试在我的解决方案中实施自定义克隆,我按照文档中的说明进行操作,但遇到了异常形式的障碍:The entity was never added to this ScoreDirector. Maybe that specific instance is not in the return values of the PlanningSolution's entity members。我知道这不是真的,因为在自定义克隆之前,没有抛出这个异常。

我的 planningClone 方法是这样设置的:

@Override
public Solution planningClone() {
    Solution clonedSolution = new Solution();
    clonedSolution.id = id;
    clonedSolution.code = code;
    clonedSolution.score = score;
    clonedSolution.field1 = field1;
    clonedSolution.field2 = field2;
    ...............
    clonedSolution.fieldN = fieldN;

    List<PlanningEntity1> clonedPlanningEntity1List= new ArrayList<PlanningEntity1>(planningEntity1List.size());
    List<PlanningEntity2> clonedPlanningEntity2List= new ArrayList<PlanningEntity2>(planningEntity1List.size());

    for (PlanningEntity1 planningEntity: planningEntity1List) {
        clonedPlanningEntity1List.add(planningEntity.clone());
    }
    for (PlanningEntity2 planningEntity: planningEntity2List) {
        clonedPlanningEntity1List.add(planningEntity.clone());
    }
    clonedSolution.planningEntity1List = clonedPlanningEntity1List;
    clonedSolution.planningEntity2List = clonedPlanningEntity2List;
    return clonedSolution;
{

我的规划实体的克隆方法是通过Java接口实现的Cloneable:

protected PlanningEntity clone() {
    try {
        return (PlanningEntity) super.clone();
    } catch (CloneNotSupportedException e) {
        e.printStackTrace();
    }
    return null;
}

为了确定,我检查了每个实体实例及其集合,以确保我的克隆工作正常,事实确实如此。

我错过了什么步骤?

如果有一个规划实体从另一个 class 指向另一个规划实体,或者可能指向一个列表,那么克隆过程需要处理这些规划实体的引用,以便它们指向克隆的 objects.This 是默认克隆过程没有问题的事情,因此使解决方案处于一致状态。它甚至可以正确更新父计划实体中的计划实体实例列表(由来自 OptaPlanner 核心的 class "FieldAccessingSolutionCloner" 的方法 "cloneCollectionsElementIfNeeded" 涵盖)。

例如,如果我们有下两个规划实体 classes

@PlanningEntity
public class ParentPlanningEntityClass{
    List<ChildPlanningEntityClass> childPlanningEntityClassList;
}

@PlanningEntity
public class ChildPlanningEntityClass{
    ParentPlanningEntityClass parentPlanningEntityClass;
}

需要将"parentPlanningEntityClass"变量设置为指向克隆的对象。当谈到列表 "childPlanningEntityClassList" 时,它首先需要使用 "new ArrayList();" 从头开始​​创建,以便工作和新的最佳解决方案(当前正在克隆的解决方案)不会指向相同的列表。最后,新创建的列表需要用克隆的对象填充。