我有两个名为OptionalCover
和OptionalPremiumComponent
的事实,OptionalCover
在其中引用了OptionalPremiumComponent
。所以这就是我插入工作记忆中的原因。
private static OptionalCover getOptionalCover(Double sumAssured, Double premiumRate) {
OptionalPremiumComponent premiumComponent = new OptionalPremiumComponent();
premiumComponent.setSumAssured(sumAssured);
premiumComponent.setPremiumRate(premiumRate);
OptionalCover optionalCover = new OptionalCover();
optionalCover.setPremiumComponent(premiumComponent);
return optionalCover;
}
kieSession.insert(getOptionalCover(1000000.0, 0.02));
我在drools中创建了以下规则
import java.lang.Number;
rule "OptionalCoverCalculation"
dialect "java"
when
opc : OptionalPremiumComponent( sumAssured > 1I && sumAssured != null && premiumRate != null && premiumRate > 0.0 )
then
opc.setPremium( opc.getSumAssured() * 0.001 * opc.getPremiumRate() );
System.out.println("Here");
end
问题是,插入父对象时没有触发上述规则。我是否必须做其他任何事情来启用此行为?是否支持?
谢谢。
答案 0 :(得分:0)
Drools引擎无法告诉你的Cover包含一个Component。 (嗯,它有,因为它可能使用反射 - 但它应该停在哪里?)
因此,您还必须插入OptionalPremiumComponent。
为了减少代码中的混乱程度,您可以编写一些巧妙的方法,以便可以通过一次调用插入Cover和Component。 例如,如果你有许多类似的“包含”关系,如果你想自由推理,你可以实现s.th.像
interface FactContainer {
List<Object> factChildren(); -- return all contained fact objects
-- OR --
void insertAll( KieSession ks );
}
其中factChildren将返回带有premiumComponent或空List的List,或者一个方法insertAll,它在内部处理所有内容。