定义Drools规则时,容纳对象图的最佳方法是什么?
假设我有以下具有多对多关系的Entity对象图:
User <- Group -> Value
我有以下设计规则:
rule "hasPurpleValue"
$u : User()
$g : Group() from $u.groups
$v : Value(color == 'Purple') from $g.values
then
//...
end
我可以将用户插入ksession,如下所示:
//build user...
User user = new User();
Group group = new Group();
Value value = new Value("Purple");
group.setValue(value);
user.addGroup(group);
ksession.insert(user);
然后更新它们:
ksession.update(ksession.getFactHandle(user), user);
但是,如果我将Value对象直接更改为"Orange"
,那么Value没有FactHandle,因为它是以用户为根插入的。是否有更好的方法来定义规则并插入实体,以便我可以独立地改变实体,Drools会评估结果?
答案 0 :(得分:1)
你必须自己做出选择。正如您在帖子中提到的,您无法更新不是事实的内容。您插入的每个对象()都是一个事实,但对于嵌套对象则不然。 处理嵌套对象的一种方法是执行刚刚执行的操作:使用 from 模式。正如您所描述的,此模式的问题是您始终必须更新()与您正在修改的实际对象相关的Fact对象。如果你可以忍受,那就去吧。 处理此问题的另一种方法是将每个对象作为事实:用户,组和值插入。这可能会使您的插入代码变得更脏,但您将获得灵活性,可读性以及在规则中的性能。 所以,这里没有神奇的食谱。您必须使用对您的方案更方便的方法。
希望它有所帮助,