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()
,但由于您删除了该谓词,因此您也不需要括号。
这个问题是之前一个问题的延续
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()
,但由于您删除了该谓词,因此您也不需要括号。