Drools JPA实体对象图更新

时间:2013-02-05 01:17:19

标签: jpa entity drools object-graph

定义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会评估结果?

1 个答案:

答案 0 :(得分:1)

你必须自己做出选择。正如您在帖子中提到的,您无法更新不是事实的内容。您插入的每个对象()都是一个事实,但对于嵌套对象则不然。 处理嵌套对象的一种方法是执行刚刚执行的操作:使用 from 模式。正如您所描述的,此模式的问题是您始终必须更新()与您正在修改的实际对象相关的Fact对象。如果你可以忍受,那就去吧。 处理此问题的另一种方法是将每个对象作为事实:用户,组和值插入。这可能会使您的插入代码变得更脏,但您将获得灵活性,可读性以及在规则中的性能。 所以,这里没有神奇的食谱。您必须使用对您的方案更方便的方法。

希望它有所帮助,