Object Drools更新嵌套成员属性

Object Drools更新嵌套成员属性,object,nested,drools,Object,Nested,Drools,我在使用Drools时遇到了一个问题。 我尝试从嵌套成员更新属性。更新似乎起作用,但WHO子句不考虑它。 我有两个Obj对象,共享同一个Cpt对象 Cpt cpt = new Cpt(); Obj obj1 = new Obj("obj1"); obj1.setComposant("R2"); obj1.counter = cpt; Obj obj2 = new Obj("obj2"); obj2.setComposant("R2"); obj2.counter = cpt; kSessi

我在使用Drools时遇到了一个问题。 我尝试从嵌套成员更新属性。更新似乎起作用,但WHO子句不考虑它。

我有两个Obj对象,共享同一个Cpt对象

Cpt cpt = new Cpt();

Obj obj1 = new Obj("obj1");
obj1.setComposant("R2");
obj1.counter = cpt;

Obj obj2 = new Obj("obj2");
obj2.setComposant("R2");
obj2.counter = cpt;

kSession.insert(obj2);
kSession.insert(obj1);
我的规则是:

rule "R2"
    when
        m : Obj(composant == "R2" && counter.value == 0)
    then
        System.out.println(m.getName() + " " + m.getCounter().getValue());
        m.getCounter().increment();
end
我希望Obj1与when子句匹配,然后更新计数器的值(从0到1)。因此,Obj2不应与where子句匹配。 但事实上,它确实如此,即使显示如我预期的那样:

obj1 0
obj2 1

有人能解释一下我做错了什么吗?

Drools规则引擎对事实集更改的所有反应都需要通过使用右侧语言的扩展之一进行通知。您需要为修改后的事实对象f调用update(f),或者可以使用modify(f){…}语句

然而。。。通过事实a的引用更改包含的对象X并告诉引擎事实a已被修改,不会使引擎看到事实B(也引用X)也已被更改

这是你应该重新考虑你的设计的地方。真的有必要通过A和B的引用共享X吗?或者:让X成为事实并更新它怎么样?后者可能意味着您必须重写规则,使Obj和Cpt之间的关系在左侧可见。但是,根据我的经验,使用这种机制通常比使用复杂的机制将更新通知从某个联合包含的对象传播到其父对象要好

编辑我所说的“使关系可见”是指以下规则:

rule "R2"
when
    Obj(composant == "R2", $counter: counter )
    $c: Cpt( this == $counter, value == 0)
then
    modify( $c ){ increment() }
end