drools getting error : handle not found for object is it in working memory

drools getting error : handle not found for object is it in working memory

这个问题是之前一个问题的延续 所以我的数据结构和之前一样:

public class Premium{
  private List<InsuranceType> insuranceTypes;
  // getter and setter
  }

public class InsuranceType {
  private String name;
  private String category;
  // getter and setter
}

这是我的规则,感谢@RoddyoftheFrozenPeas

rule "Example"
when
  $pcr:Premium( $insuranceTypes: insuranceTypes )
  $ins:( InsuranceType( name == "TPD" , category == "D" ) from $insuranceTypes )      
then
  modify( $ins ){ 
        setCategory("A"); 
  }     
end

但是当运行这条规则出现异常时:

java.lang.RuntimeException: Update error: handle not found for object: InsuranceType [name=TPD, category=A]. Is it in the working memory?

发生这种情况是因为我正在检查同一属性并更新它吗? 我的用例是替换该值,因此我必须检查它是否存在( category = D 然后将其设置为 'A' )

InsuranceType 不在工作记忆中 -- Premium 是。所以你需要修改的是保费,而不是保险类型。

确实没有什么好办法。您可以调用 update,但这会重新触发 所有 规则(这相当于使用工作内存中的新数据重新开始。)

then
  $ins.setCategory("A");
  update( $pcr );
end

这可能会导致副作用,例如循环或过多的规则触发器。

或者,您可以通过设置列表值来修改溢价:

then
  $ins.setCategory("A");
  modify( $pcr ){ 
    setInsuranceTypes($insuranceTypes)
  }     
end

...这很笨重,但只要我们没有丢失对列表的引用就应该做我们想做的。


此外,不完全相关,但是在您的 $ins 声明行中不需要外部 ()。这足够了:

$ins: InsuranceType( name == "TPD" , category == "D" ) from $insuranceTypes

我认为您的原始规则有一个 exists(),但由于您删除了该谓词,因此您也不需要括号。